单链表

169 阅读2分钟

线性表链式存储有两个一个是单链表,另一个是双向链表,它们的特点:用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。

单链表的结构特点:

单链表的每个结点,都有两个域:其中存放数据的域称为data域,存放直接后继存储地址的域称为指针域。一个个的结点组成形成单链表

通常我们会将第一个节点不存放任何数据,next存放下一个结点的地址,这样的结点成为首元结点,方便我们操作链表。

用C++定义单链表的结构

typedef struct LNode{
    int data;             //  节点的数据域
    struct LNode *next;   // 结点的指针域
}LNode,*LinkList;

单链表的初始化

LNode* InitList(){  //传入一个 LinkList 的变量
    //构造一个空的单链表
    LinkList L = new LNode;
    L->next = NULL;
    return L;  //返回 L表示构造成功。
}

后叉法创建单链表

需要先传入一个单链表的引用,传入创建几个结点,创建一个指针r 指向单链表L

接着创建结点用指针p指向该结点,输入数据后,需要将 r的next指向p,别忘记r要向后移动

void CreateList_R(LinkList &L,int n){
    LinkList r = L;
    for(int i=0;i<n;i++){
        LinkList p = new LNode;
        cout << "请输入值:"<< endl;
        cin >> p->data;
        p->next = NULL;
        r->next = p;
        r = p;
    }
}

遍历单链表

void showLinkList(LinkList &L){
    LinkList p = L->next;
    while(p){
        cout << p->data << " " << endl;
        p = p->next;
    }
}

销毁单链表

int DestroyList_L(LinkList &L){
    LNode *p;
    while(L!=NULL){
        p = L;
        L = L->next;
        delete p;
    }
    return 1;
}

获取链表长度

int GetListLength(LinkList &L){
    LinkList p;
    p = L ->next;
    int i = 0;
    while(p){
        i++;
        p = p->next;
    }
    return i;
}

注意: 单链表并不向线性表那样查找方便,单链表对于插入和添加是很方便的。