单链表 c实现 详细注释
来源:互联网 发布:ubuntu命令行升级系统 编辑:程序博客网 时间:2024/06/05 04:08
经过很长时间的研究,因为刚学指针就像拿单链表来实现以下,
单链表其实只要理解了 指针域的移动就不是问题了
从开始的抄代码 到后面的自己写
参考书目《大话数据结构》
#include <stdio.h>#include <stdlib.h>#include <time.h>//创建单链表的成员 其实就是结点//link p; p就是一个结点typedef struct Link { int data; //数据域 struct Link *next; //指针域}link; //link 为这个结构体的别名//初始化链表link *initLink() { link *p = (link*)malloc(sizeof(link)); //创建一个头结点 //动态分配内存 link *temp = p; //声明一个指针指向头结点,用于遍历链表 //14行中创建了一个头结点 定义一个指针 因为p是指针变量 temp也是指针变量 //生成链表 for (int i = 1; i < 5; i++) { link *a = (link*)malloc(sizeof(link)); //创建一个新的结点 //对这个结点的成员进行赋值 a->data = i; a->next = NULL; //这个结点的指针指向NULL 表示结束标志 temp->next = a; //temp的作用用来遍历链表 temp = temp->next; } return p;}//链表的基本操作//对链表进行插入link * insertElem(link *p, int elem, int add) { link *temp = p; //创建临时结点用来遍历链表 //先找到要插入的位置的上一个结点 for (int i = 1; i < add; i++) { if (temp == NULL) { printf("插入位置无效\n"); return p; //这里形参为这个链表的首地址 如果首地址指向为空 说明是一个空链表 //还有一种情况就是 在i进行遍历的时候还未到达add的位置就已经结束了 } temp = temp->next; //进行遍历 temp一步的往后移 } //创建插入结点c //链表中的所有存储方式必须是以结点的方式 link *c = (link*)malloc(sizeof(link)); // c->data = elem; //数据域 //向链表中插入结点 //这里是插入结点的一个方法 先通过新节点连接后面的数 然后原来的结点连接新节点 c->next = temp->next; temp->next = c; return p;}link *delElem(link *p, int add) { link *temp = p; //创建一个临时结点用来遍历 //判断删除位置是否正确 for (int i = 1; i < add; i++) { if (temp == NULL) { printf("删除位置异常\n"); return p; } temp = temp->next; } link *c = temp->next; //这里定义的这个非常巧妙 //此时的c指向被删去的结点 //要删除直接将其覆盖 temp->next = c->next; //这里就ok free(c); //释放内存 return p;}int selectElem(link *p, int elem){ link *temp = p; int i = 1; while (temp->next) { temp = temp->next; if (temp->data == elem) return i; } return -1;}//进行更改link *amendElem(link *p, int add, int newElem){ link *temp = p; //创建一个临时结点用来遍历 for (int i = 1; i < add; i++) { if (temp == NULL) { printf("更改位置无效\n"); return p; } temp = temp->next; } //此时的temp指向更改位置的前一个点 link *amend = temp->next; //创建一个临时结点指向更改的位置 amend->data = newElem; //更改数据成功 return p;}//输出链表void display(link *p) { link *temp = p; //创建一个临时结点用来遍历 //只要temp->next不指向NULL就输出 while (temp->next) { temp = temp->next; printf("%d ", temp->data); } printf("\n");}//测试案例int main() { //初始化链表 printf("\n------初始化链表----------\n"); link *p = initLink(); display(p); printf("在第4的位置插入元素5:\n"); p = insertElem(p, 5, 4); display(p); printf("删除元素3:\n"); p = delElem(p, 3); display(p); printf("查找元素2的位置为:\n"); int address = selectElem(p, 2); if (address == -1) printf("没有该元素\n"); else printf("元素2的位子为:%d\n", address); printf("更改第3的位置的数为7:\n"); p = amendElem(p, 3, 7); display(p); return 0;}
//这里实现的单链表还比较简单
//以后会深入
阅读全文
0 0
- 单链表 c实现 详细注释
- 哈希表查找C实现(详细注释)
- C语言实现List的数据结构(很详细的注释)
- 五子棋(C语言) 详细注释
- WAKEUP.C的详细注释
- ADDSYNTH.C的详细注释
- Objective-C 【电商APP应用代码-系统分析-详细注释-代码实现】
- C 语言 实现大数相乘问题(包括正、负整数,另外还附有详细注释)
- 哈夫曼压缩算法C语言实现——步骤,详细注释源码
- 根据Merge Sort原理, 自己实现的归并排序算法+详细注释+代码(C#,C/C++) [分享]
- 《学习opencv》kalman.c详细注释
- Android 多线程下载源码实现详细注释
- verilog实现的红外解码(详细注释)
- 归并排序C++实现,详细注释
- 轮播图的实现(带详细注释)
- 模拟实现广义表(详细注释)
- php实现图片缩放,超详细注释
- C语言实现注释转换
- n个数的排序
- 韬光养晦一周年,拍拍二手品牌为何今日才“亮剑”?
- PCA及白化的数学理解
- ubuntu 16.04源
- 从整数数组中找出唯二奇数次的数字 Python版
- 单链表 c实现 详细注释
- 常用Linux命令
- npm包管理工具的安装及配置使用
- 116. Populating Next Right Pointers in Each Node
- 牛客网 1222 01
- 15算法课程 303. Range Sum Query
- if条件语句 加括号与不加 括号 的区别
- 如何改变Redis用不好的误区
- 24. Swap Nodes in Pairs