C语言实现带头结点的链表的创建、查找、插入、删除操作
本文实例讲述了C语言实现带头结点的链表的创建、查找、插入、删除操作。是数据结构中链表部分的基础操作。分享给大家供大家参考。具体方法如下:
#include <stdio.h> #include <stdlib.h> typedef struct node { int data; struct node* next;// 这个地方注意结构体变量的定义规则 } Node, *PNode; Node* createLinklist(int length) { int i = 0; PNode pHeader = NULL; PNode pTail = NULL; PNode pTemp = NULL; printf("create\n"); pHeader = (PNode)malloc(sizeof(Node));// 申请头结点 if (!pHeader) { exit(-1); } pHeader->next = NULL; for (i = 0; i < length; i++) { pTemp = (PNode)malloc(sizeof(Node));// 用malloc要包含头文件 if (!pTemp) { exit(-1); } pTemp->data = i*10; pTemp->next = NULL; if (!pHeader->next) { // 第一个结点是空的,则先连接第一个结点 pHeader->next = pTemp; } else { pTail->next = pTemp; } pTail = pTemp; } return pHeader; } Node* search(PNode pHeader, int k) { PNode p = pHeader->next; int i = 1; printf("search\n"); while(p && (i < k)) { p = p->next; i++; } if (p && (i == k)) // 这步的i == k是必须的, // 因为如果一开始的时候 i就 >= k并且pHeader->next还不为NULL这一步就会必过,导致返回的是第一个元素的值 { return p; } return NULL; } int insert(PNode pHeader, PNode pNew, int k) { PNode p = NULL; printf("insert\n"); if ( 1 == k ) { p = pHeader; } else { printf("==>"); p = search(pHeader, k-1); } if (p) { // 带头结点和不带头结点的主要区别之一就在这 // 如果不带头结点,那么在第一个位置插入结点的操作应该是 // pNew->next = p; // p = pNew; // 带头结点的操作如下 pNew->next = p->next; p->next = pNew; return 1; } return 0; } int deleteNode(PNode pHeader, int k) { PNode p = NULL; printf("deleteNode\n"); if (1 == k) { p = pHeader->next; } else { printf("==>"); p = search(pHeader, k-1); } if (p && p->next) { // 不带头结点的操作时删除第一个结点的操作 // Node* temp = p; // p = p->next; // free(temp); // 带头结点的操作如下 PNode temp = p->next; p->next = temp->next; free(temp); return 1; } else { printf("Not Found\n"); return 0; } } void print(PNode pHeader) { PNode p = pHeader->next; printf("print\n "); while(p) { printf("%4d ", p->data); p = p->next; } putchar('\n'); } void freeList(PNode pH) { PNode p = NULL; printf("freeList\n"); while(NULL != pH) { p = pH; pH = pH->next; printf("%4d be freed\n", p->data); free(p); } } int main(void) { PNode pHeader = NULL;// C和C++中判断指针为空都是用NULL宏(全大写) PNode pNew = NULL; PNode result = NULL; pHeader = createLinklist(10); print(pHeader); result = search(pHeader, 5); if ( result ) { printf("%d\n", result->data); } else { printf("Not Found\n"); } pNew = (PNode)malloc(sizeof(Node)); if (!pNew) { exit(-1); } pNew->data = 100; pNew->next = NULL; insert(pHeader, pNew, 5); print(pHeader); deleteNode(pHeader, 12); print(pHeader); freeList(pHeader); return 0; }
上述实例备有较为详尽的注释,相信不难理解。希望本文所述对大家C程序数据结构与算法设计有所帮助。
栏 目:C语言
下一篇:贪吃蛇游戏C++命令行版实例代码
本文标题:C语言实现带头结点的链表的创建、查找、插入、删除操作
本文地址:https://www.xiuzhanwang.com/a1/Cyuyan/3371.html
您可能感兴趣的文章
- 04-02c语言函数调用后清空内存 c语言调用函数删除字符
- 04-02c语言的正则匹配函数 c语言正则表达式函数库
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言中对数函数的表达式 c语言中对数怎么表达
- 04-02c语言用函数写分段 用c语言表示分段函数
- 04-02c语言编写函数冒泡排序 c语言冒泡排序法函数
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段函数
- 04-02C语言中怎么打出三角函数 c语言中怎么打出三角函数的值
- 04-02c语言调用函数求fibo C语言调用函数求阶乘
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 04-02jquery与jsp,用jquery
- 01-10C#中split用法实例总结
- 01-10SublimeText编译C开发环境设置
- 01-11ajax实现页面的局部加载
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 01-10delphi制作wav文件的方法
- 01-10使用C语言求解扑克牌的顺子及n个骰子