单链表的操作(cpp)

来源:互联网 发布:c语言temp是什么意思 编辑:程序博客网 时间:2024/05/22 15:34
单链表是链表中最为简单的操作,也是基础操作,接下来,我就简单讲讲单向链表的操作。先声明一个链表

typedef struct LNode {
ElemType data;
struct LNode *next;
}LinkNode;

因为链表起初可以当作默认为空,因此,先要创建一个头结点,同时,设置首结点为空(ps:注意头结点与首结点的区别),比如我创建了一个L的链表,L->head就是头结点,L->next就是一个首结点
这里写图片描述

/*判断链表是否为空*/bool ListEmpty(LinkNode *L) {   //判断链表是否为空,只要判断链表的节点是否为空    return (L->next == NULL);}

需要了解链表长度可以设置一个变量count设置为0,然后遍历链表,每遍历一次count++,遍历结束就得到了链表的长度

void ListLength(LinkNode *L) {    int count = 0;    LinkNode *p = L;    while (p->next != NULL) {        count++;        p = p->next;    }    printf("\n";}

查询一个元素的时候也是同理,遍历一个链表,找到相应元素就返回true.

/*该函数作用的是查找该元素是否存在*/bool GetElem(LinkNode *L, int i, ElemType &e) { //i个结点    int j = 0;    LinkNode *p = L;//指向头结点    if (i <= 0) return false;    while (j < i && p != NULL) {        j++;        p = p->next;    }    if (p == NULL) {        return false;    }else {        e=p->data;        return true;    }}

插入元素和删除元素是链表中最为重要的操作。
插入元素:依旧是需要遍历链表,我们需要遍历到第i-1个位置(数组下标从0开始),将首结点向后移一个位置,这时候将s的结点放到首结点的位置,就完成了插入操作
这里写图片描述

bool ListInsert(LinkNode *&L, int i, ElemType e) {    int j = 0;    LinkNode *p = L, *s;    if (i < 0) return false;    while (j < i - 1 && p != NULL) {        j++;        p = p->next;    }    if (p == NULL)        return false;    else {        s = (LinkNode *)malloc(sizeof(LinkNode));        s->data = e;        s->next = p->next;        p->next = s;        return true;    }}

删除链表结点:只需要绕过所要删除的结点,直接将指针
向首结点的下一个结点。
这里写图片描述

/*删除链表结点*/bool ListDelete(LinkNode * &L, int i, ElemType &e) {    int j = 0;    LinkNode *p = L, *q;    if (i <= 0) return false;    while (j < i - 1 & *& p != NULL) {        j++;        p = p->next;    }    if (p == NULL) return false;    else {        q = p->next;        if (q == NULL) return false;        e = q->data;        p->next = q->next;        free(q);        return true;    }}

销毁链表:遍历每个结点的同时释放每个结点的内存

void DestroyList(LinkNode *&L) {    LinkNode *pre = L, *p = L->next;    while (p != NULL) {     //逐步遍历链表        free(pre);          //释放每个链表结点的内存        pre = p;            //释放当前结点之后,将指针指向下一个结点        p = pre->next;    }    free(pre);}
原创粉丝点击