数据结构_单链表(带头节点)

来源:互联网 发布:linux卸载软件 yum 编辑:程序博客网 时间:2024/06/06 00:50

单链表(以带头节点的单链表为例)的表示图如下:

  

1. 定义单链表结构,结构体中包括 data 数据域和 next 指针域,代码如下:

typedef struct Node{int data;//数据域struct Node *next;//指向下一个节点}Node,*List;//List == Node*

2. 单链表的初始化,代码如下:

void InitList(List plist){assert(plist != NULL);plist->next = NULL;//plist->data不用操作}

3. 利用头插法进行插入,代码如下:

bool Insert_Head(List plist,int val){Node *p = (Node *)malloc(sizeof(Node));p->data = val;p->next = plist->next;plist->next = p;return true;}

4. 利用尾插法进行插入,代码如下:

bool Insert_Tail(List plist,int val){Node *p = (Node *)malloc(sizeof(Node));p->data = val;Node *q;for(q=plist;q->next!=NULL;q=q->next) ;//将p插入在q的后面p->next = q->next;q->next = p;return true;}

5. 按照关键字进行查找,代码如下:

Node *Search(List plist,int key){for(Node *p=plist->next;p!=NULL;p=p->next){if(p->data == key){return p;}}return NULL;}

6. 查找关键字 key 的前驱,代码如下:

static Node *SearchPri(List plist,int key){for(Node *p=plist;p->next!=NULL;p=p->next){if(p->next->data == key){return p;}}return NULL;}

7. 按照关键字进行删除,代码如下:

bool Delete(List plist,int key){Node *p = SearchPri(plist,key);if(p == NULL){return false;}Node *q = p->next;p->next = q->next;//将q从链表中剔除free(q);return true;}

8. 判空,代码如下:

bool IsEmpty(List plist){return plist->next == NULL;}

9. 求单链表的长度,代码如下:

int GetLength(List plist){int count = 0;for(Node *p=plist->next;p!=NULL;p=p->next){count++;}return count;}

10. 打印单链表,代码如下:

void Show(List plist){for(Node *p=plist->next;p!=NULL;p=p->next){printf("%d ",p->data);}printf("\n");}

11. 清楚单链表,代码如下:

void Clear(List plist){Destroy(plist);}

12. 摧毁单链表,代码如下:

void Destroy(List plist){Node *p;while(plist->next != NULL)//删除第一个数据节点{p = plist->next;plist->next = p->next;free(p);}/*Node *p = plist->next;}

13. 单链表逆置,代码如下:

void Revers(List plist){//头插的思想if(plist==NULL || plist->next==NULL ||   plist->next->next==NULL){return ;}Node *p = plist->next;Node *q;plist->next = NULL;//while(p != NULL){q = p->next;//将p头插进链表p->next = plist->next;plist->next = p;p = q;}}













原创粉丝点击