数据结构链表 --头指针链表复习
来源:互联网 发布:漫画绘图软件免费下载 编辑:程序博客网 时间:2024/05/29 19:48
一、链表的主要功能结构如下:
实现链表有1、头指针链表 2、头节点链表
注:(display函数不需要改变head,只需要将链表数据擦查看,只进行打印就好。所以定义的就是一级指针。)
1、链表的建立分为带头结点的头插法和带头结点的尾插法,第一种方法插入顺序和输出顺序是相反的。第二种方法插入顺序和输出顺序是一致的。这里我们俩种方法介绍 尾插法,头插法
头插法
头插法是使用二级指针,共计俩个大步骤;第一个步骤主要是使用head来操作堆上的数据空间内存;
第二步骤是通过插入函数中的指针操作head指针,从而达到操作堆上存储空间上节点数据的插入;
int Insert (Node**h,int Data){ if(h == NULL) { return -1; } // 创建新的节点,用于插入 Node*node = (Node*)malloc(sizeof(Node)/sizeof(char)); if(node == NULL) { return -1; } node->data = data; node->next = *h; *h = node; return 0;}2在尾部插入数据nt Insert_Tail(Node **h, ElementType data){ if (h == NULL) return ERROR; // 新建节点 Node *node = (Node*)malloc(sizeof(Node)/sizeof(char)); if (node == NULL) { return ERROR; } node->data = data; node->next = NULL; // 空表 if (*h == NULL) { *h = node; } else // 非空表 { // 找最后一个节点 Node *tmp = *h; // 指向链表的第一个节点 while(tmp->next) { tmp = tmp->next; } tmp->next = node; } return 0;}
3、 任意位置的插入(新的方法进行任意位置的插入)(只考虑空表状态与非空表状态,然后在空表状态下与空表状态下进行详细的划分,空表状态下插入位置不为1的考虑,非空表状态下要考虑位置为1的插入,然后除去1位置的插入外,还要查找要插入位置的前一个节点,然后进行数据节点的插入)
// 在任意位置插入
int Insert_pos(Node**h,int pos,ElementData data){ Node*node = (Node*)malloc(sizeof(Node)/sizeof(char)); if(node == NULL || pos < 1 ) return -1; node->data = data; // 在空表的状态下,只能插入第一个节点处 if(*h ==NULL) { if(pos != 1) { printf("不能在第%d个位置插入数据\n",pos); free(node); // 释放空间 return -1; } node->next = NULL; *h = node; } else { if (pos == 1) // 插入位置为1 { node->next = *h; *h = node; } else { Node*tmp = *h; int i; for(i = 0;i < pos -2;i++) // 查找要插入位置的前1位置,走的步数 { // 考虑越界问题 if(tmp == NULL) // pos值过大会导致越界 break; tmp = tmp->next; } } if(tmp == NULL) { printf("插入越界\n"); } node->next = tmp->next; tmp->next = node; } return0;}4、在任意位置删除数据调用函数int Delete_Pos(Node**h,int pos){ Node*tmp = *h; if(h == NULL || *h == NULL || pos < 1) // 进行错误判断 return -1; else if (pos == 1) // // 删除位置为1 的地方 { free(tmp); // 将空间释放掉 } else // 非空表状态下的删除 { int i; for(i = 0;i < pos -2;i++) { // 考虑越界问题 if(tmp == NULL) break; tmp = tmp->next; } } if(tmp == NULL) // 判断一下越界问题 { printf("插入越界\n"); } Node*p = tmp->next; tmp->next = p->next; free(p); return 0;}
5、链表的逆序操作;
此操作需要使用多指针进行操作;
(1)核心代码
tmp = p->next;
p->next = q;
q= p;
p = tmp;
(2)在核心代码前进行的操
Node *p = (*h)->next;
Node *q = *h;
Node *temp; // 为了进行保存,进行得操作代码区域
int Reverse_List(Node **h)
{
// *h 代表空表 (*h)->next == NULL 只有一个节点
if (h == NULL || *h == NULL || (*h)->next == NULL)
{
return OK;
}
Node *p = (*h)->next; Node *q = *h;Node *temp; // 为了进行保存,进行得操作while (p){ temp = p->next; // 将下一个的名字命名为temp; p->next = q; // 将p向回指向他的前一个节点, q = p; // 指向以后将 q 和p 均前进一步操作,然后在进行操作 p = temp;}// 把第一个节点的下一个节点置为空(*h)->next = NULL; // 将最初的节点置为空// 重置头指针*h = q; // 将头指针指向原链表的最后一个return OK;
}
“`
- 数据结构链表 --头指针链表复习
- 数据结构头指针链表
- 数据结构链表 --头节点链表复习
- 【数据结构链表复习】
- 数据结构-线性表-头指针&头结点
- 数据结构-线性表-头指针&头结点
- 头指针链表
- 头指针链表
- 链表的 头指针 头结点
- 【数据结构复习】链表相关
- 链表复习头插和尾插法
- 链表之头指针
- 数据结构头结点链表
- 数据结构之链表(头指针链表的插入、删除、逆序)
- 数据结构之头指针链表的逆序、输出和指定位置的删除
- 《数据结构》只设置尾指针而不设置头指针的讯循环链表的合并
- C语言指针函数链表复习
- 复习数据结构链表插入排序
- 微信小程序周报(第八期)
- Spark编程之基本的RDD算子之cogroup,groupBy,groupByKey
- linux 系统文件校验方法--MD5,SHA1,PGP
- Linux内核Notifier机制
- App启动白屏和黑屏如何处理?
- 数据结构链表 --头指针链表复习
- Dex2Oat执行参数总结
- 华为OJ——计算字符串的距离
- angular2使用lodash深拷贝js对象
- 【HDU-1235】 统计同成绩学生人数
- CSS3背景颜色渐变效果
- Scala基础—多线程示例
- java.net.UnknownHostException: api.weixin.qq.com解决办法
- 嵌入式面试题总结-C语言知识点相关