单链表

Posted suizhixxie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单链表相关的知识,希望对你有一定的参考价值。

链表

用不连续的、或连续的存储单元存储线性表元素

每个数据元素后,加上一个地址域,其地址为其直接后继的地址;数据元素和地址域组成结点。

技术图片

 头指针:指向链表的第一个结点,是第一个节点的地址,或链表在存储器中的首地址

头指针的类型与其他节点指针域的指针类型一致,都是指向同一类型的结点

单链表由头指针唯一确定。

技术图片

typedef int elementType;
struct slNode
{
    elementType data;//数据域
    struct slNode* next;//指针域
        //对自身的引用    
}node;
/*以下两种方式也都是同样的把node定义为slNode类型
typedef struct slNode node;
typedef slNode node;*/
class SingleLinkedList
{
public:
    SingleLinkedList();//初始化链表
    int length();                    //求链表长度
    bool getElement(int i,elementType& x);//按序号返回元素
    node* loccate(elementType x);//查找元素 返回目标指针
    bool listinsert(int i,elementType x);
    bool listdelete(int i);
    bool InclistJudge();//判断是否是递增链表
    void incListInsert(elementType x);//递增链表插入元素
    void createListR();//尾插法创建单链表
    void createListH();//头插法创建单链表
    void print();//打印单链表元素
    void destory();//销毁所有node结点 否则内存泄露
    
    ~SingleLinkedList();
private:
    node* head;
    //定义头指针  初始化

    
};
SingleLinkedList::SingleLinkedList()
{
    head = new node;   //为head请求内存
    head->next = NULL; //置为空表
}
int SingleLinkedList::length(){
    node* p = head->next;
    int len =0;
    
    while (p)://最后一个元素的值为null
        len++;
        p = p->next;//每次指向下一个元素  
    return len;
}
bool SingleLinkedList::getElement(int i, elementType& x)
{
    node* p = head->next;
    int j = 1;
    while(p!=NULL && j!=i){
        j++;
        p = p->next;
    }
    if (p==NULL){
        return false;
    }
    x = p->data;
    return true;
}
node* SingleLinkedList::loccate(elementType x){
    node*p = head->next;
    while(p){
        if (p->data == x)
            return p;
        else
            p = p->next;
    }    
    return NULL;
}

bool SingleLinkedList::listinsert(int i,elementType x)
{
    node*p = head;
    node*s
    int j = 0
    while (p && j!=i-1){
        p =p->next;    //先利用j去找到位置
        j++;
    }
    if(p==NULL){
        return false;
    }
    else{
        s = new node;
        s->next = p->next;
        p->next = s;
        s->data = x;
        return true;

    }
}
bool SingleLinkedList::listdelete(int i){
    int j = 0;
    node* p = head;
    while(p && j != i-1)
    {
        p = p->next;
        j++;
    }
    if (p == NULL)
        return false;
    else{
        node* d = p->next;
        p->next = d->next;
        delete d;
        return true;
    }
}
bool SingleLinkedList::InclistJudge(){
    node *p,*h;
    p = head;
    if (p==NULL)
        return true;
    else{
        h = p->next;
        if (h->data < p->data)
            return false;
        p = h;

    }
    return true;
}
void SingleLinkedList::createListR(){
    elementType x;
    node *R,*p;
    if(head == NULL){
        head = new node;
        head->next = NULL;
    }
    R = head;
    cout << "尾插法 输入(-100)退出"<<endl;
    cin >>x;
    while(x != -100){
        p = new node;
        p = R->next;
        p->data = x;
        cin >> x;
        R = p;
    }
    R->next = NULL;
    R = NULL;
    p = NULL;//最后将两个指针都放空

}
void SingleLinkedList::createListH(){
    if(head == NULL){
        head = new node;
        head ->next = NULL;
    }
    elementType x;
    node *p,*R;
    cout<<"头插法创建单链表 输入(-100)退出"<<endl;
    cin >> x;
    while(x != -100){
        R = new node;
        head -> next = R->next;
        R->data = x;
        head ->next = R;
        cin >> x;
    }
}
void SingleLinkedList::print(){
    node* p;
    p = head;
    while(p){
        cout<<p->data<<"	";
        p = p->next;
    }
    cout << endl;
}
void SingleLinkedList::destory(){
    node *p,*u;
    p =head;
    while(p){
        u = p->next;
        delete p;
        p = u;
    }
    head = NULL;
}
void SingleLinkedList::incListInsert(elementType x){
    node *p,*q;
    p=head;
    while(p->next != NULL && p->next->data<x){
        p = p->next;
    }
    q = new node;
    q->data = x;
    q->next = p->next;
    p->next = q;
}

 

以上是关于单链表的主要内容,如果未能解决你的问题,请参考以下文章

数据结构代码(用C语言) 单链表的插入和删除

单链表

数据结构--单链表简单代码实现(总结)

单链表逆置

循环链表(循环单链表循环双链表)的相关操作的代码实现(C语言)

单链表反转java代码