C语言 链表的创建--打印--逆置--新增--删除--排序--释放
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h>//定义结构体 typedef struct _student{int num;struct _student *pNext; }Student;//创建链表(顺序创建链表) Student * SList_Create(int *len/*out*/); //创建链表(逆序创建链表) Student * SList_Create2(int *len/*out*/); //打印链表 int PrintfAll(Student *pin/*in*/); //链表排序 int Sort(Student *pin/*in*/, int *len/*in*/); //插入指定位置节点 int InsertOption(int numx/*in*/, Student *pin/*in*/, int *len/*out*/); //链表顺序逆置 int NoSort(Student *pin/*in*/, Student **pout/*out*/); //链表顺序逆置2 int NoSort2(Student **pin/*in*/); //删除指定节点 int RemoveNode(int numx/*in*/, Student *pin/*in*/, int *len/*out*/); //释放内存 int FreeAll(Student **pin/*in*/);void main(){Student *s1 = NULL, *s2 = NULL;//定义链表长度int len = 0;//初始化链表s1 = SList_Create(&len);int res = 0;//打印链表printf("\n------------s1打印链表--------------------\n");res = PrintfAll(s1);if (res != 0){printf("s1打印链表程序出现错误!\n");goto END;}//删除链表中指定节点printf("\n------------s1链表逆置--------------------\n");res = NoSort2(&s1);if (res != 0){printf("链表逆置程序出现错误!\n");goto END;}//打印链表printf("\n------------s1打印链表--------------------\n");res = PrintfAll(s1);if (res != 0){printf("s2打印链表程序出现错误!\n");goto END;}END://释放链表内存if (s1 != NULL){FreeAll(&s1);}if (s2 != NULL){FreeAll(&s2);}system("pause"); }//创建链表(顺序创建链表) Student * SList_Create(int *len/*in*/){if (len == NULL){printf("不可以为NULL\n");return NULL;}//定义链表头结点指针Student * pHead = NULL, *pMalloc = NULL, *pCurrent = NULL, *pPrior = NULL;int numx = 0, index = 0;while (1){printf("请输入学生的编号!\n");scanf("%d", &numx);if (numx == -1){break;}pCurrent = (Student *)malloc(sizeof(Student));//注意这部分的内存释放if (pCurrent==NULL){printf("创建链表分配内存失败,释放已创建内存!\n");FreeAll(&pHead);}memset(pCurrent, 0, sizeof(Student));pCurrent->num = numx;pCurrent->pNext = NULL;if (pPrior != NULL){pPrior->pNext = pCurrent;pPrior = pCurrent;}else{pHead = pPrior = pCurrent;}index++;}*len = index;return pHead; }//创建链表(逆序创建链表) Student * SList_Create2(int *len/*in*/){if (len == NULL){printf("链表的长度不可以为NULL\n");return NULL;}//定义链表头结点指针Student * pHead = NULL, *pMalloc = NULL, *pCurrent = NULL, *pNext = NULL;int numx = 0, index = 0;while (1){printf("请输入学生的编号!\n");scanf("%d", &numx);if (numx == -1){break;}pCurrent = (Student *)malloc(sizeof(Student));if (pCurrent == NULL){printf("创建链表分配内存失败,释放已创建内存!\n");FreeAll(&pHead);}memset(pCurrent, 0, sizeof(Student));pCurrent->num = numx;pCurrent->pNext = pNext;pNext = pCurrent;index++;}pHead = pCurrent;*len = index;return pHead; }//打印链表 int PrintfAll(Student *pin/*in*/){int ERRO_MSG = 0;if (pin == NULL){ERRO_MSG = 1;printf("pin==NULL erro msg:%d\n", ERRO_MSG);return ERRO_MSG;}Student *pHead = NULL, *pCurrent = NULL;pHead = pCurrent = pin;while (pCurrent != NULL){printf("%d\n", pCurrent->num);pCurrent = pCurrent->pNext;}return ERRO_MSG; }//链表排序 int Sort(Student *pin/*in*/, int *len/*in*/){int ERRO_MSG = 0;if (pin == NULL || len == NULL){ERRO_MSG = 1;printf("pin==NULL|| len==NULL erro msg :%d\n", ERRO_MSG);return ERRO_MSG;}//定义链表变量Student *pHead = NULL, *pPrior = NULL, *pCurrent = NULL, *pNext = NULL;//接收链表变量pCurrent = pin;//冒泡排序//分析:两种方案①是调换链表元素的指针,但是操作复杂,理解麻烦,而且这个环境里,结构体并不是很大(如果结构体比较大,那么推荐使用指针替换),复杂的逻辑不适合//②调换链表元素的值,这个方案比较简单//链表一般使用while,因为不知道链表的个数//获取链表中实际元素的个数,方便冒泡排序,(冒泡排序循环的次数和元素的个数有关)int numx = *len;while (numx){//将最大的元素扔到末尾//重置pCurrentpPrior = pCurrent = pin;while (pCurrent != NULL){if (pPrior != pCurrent){if (pPrior->num>pCurrent->num){numx = pPrior->num;pPrior->num = pCurrent->num;pCurrent->num = numx;}}pPrior = pCurrent;pCurrent = pCurrent->pNext;}numx--;}return ERRO_MSG; }//插入指定位置节点 int InsertOption(int numx/*in*/, Student *pin/*in*/, int *len/*out*/){int ERRO_MSG = 0;if (pin == NULL || len == NULL){ERRO_MSG = 1;printf("pin == NULL || len==NULL erro msg:%d\n", ERRO_MSG);return ERRO_MSG;}Student *pHead = NULL, *pPrior = NULL, *pCurrent = NULL, *pMalloc = NULL;//创建指定元素pMalloc = (Student *)malloc(sizeof(Student));if (pMalloc == NULL){ERRO_MSG = 2;printf("创建链表分配内存失败! erro msg:%d\n", ERRO_MSG);return ERRO_MSG;}pMalloc->num = numx;pMalloc->pNext = NULL;pCurrent = pPrior = pin;//思路:找到目标节点的当前节点和前一个节点,比较指定元素是否比连表中元素大//先比较第一个元素和指定元素的大小if (pCurrent->num>pMalloc->num){pMalloc->pNext = pCurrent;pin = pMalloc;}else{//遍历链表while (pCurrent != NULL){if (pPrior != pCurrent){if (pMalloc->num<pCurrent->num){//把这个节点插入到链表中pPrior->pNext = pMalloc;pMalloc->pNext = pCurrent;break;}}pPrior = pCurrent;pCurrent = pCurrent->pNext;}}*len++;return ERRO_MSG; }//链表顺序逆置 int NoSort(Student *pin/*in*/, Student **pout/*out*/){int ERRO_MSG = 0;if (pin == NULL || pout == NULL){ERRO_MSG = 1;printf("pin == NULL || pout==NULL erro msg:%d\n", ERRO_MSG);return ERRO_MSG;}Student *pCurrent = NULL;Student *pHead2 = NULL, *pCurrent2 = NULL, *pNext2 = NULL;pCurrent = pin;;while (pCurrent != NULL){pCurrent2 = (Student *)malloc(sizeof(Student));pCurrent2->num = pCurrent->num;pCurrent2->pNext = pNext2;pNext2 = pCurrent2;pCurrent = pCurrent->pNext;}pHead2 = pCurrent2;*pout = pHead2;return ERRO_MSG; }//链表顺序逆置2 int NoSort2(Student **pin/*in*/){int ERRO_MSG = 0;if (pin == NULL){ERRO_MSG = 1;printf("pin == NULL erro msg:%d\n", ERRO_MSG);return ERRO_MSG;}Student *pHead = NULL, *pCurrent = NULL, *pNext = NULL, *pPrior = NULL;pCurrent = pPrior = *pin;pNext = pCurrent->pNext;pPrior->pNext = NULL;if (pCurrent->pNext=NULL){return ERRO_MSG;}while (pCurrent){if (pCurrent != pPrior){//下一个节点pNext = pCurrent->pNext;pCurrent->pNext = pPrior;}pPrior = pCurrent;pCurrent = pNext;}pHead = pPrior;*pin = pHead;return ERRO_MSG; }//删除指定节点 int RemoveNode(int numx/*in*/, Student *pin/*in*/, int *len/*out*/){int ERRO_MSG = 0;if (pin == NULL || len == NULL){ERRO_MSG = 1;printf("pin == NULL || len==NULL erro msg:%d\n", ERRO_MSG);return ERRO_MSG;}//定义链表变量Student *pHead = NULL, *pCurrent = NULL, *pNext = NULL, *pPrior = NULL;pPrior = pCurrent = pin;//判断第一个节点if (pCurrent->num == numx){pHead = pCurrent->pNext;//释放该节点free(pCurrent);}else{//遍历链表while (pCurrent != NULL){if (pCurrent != pPrior){if (pCurrent->num == numx){pPrior->pNext = pCurrent->pNext;//释放该节点free(pCurrent);pCurrent = NULL;pCurrent = pPrior->pNext;continue;}}pPrior = pCurrent;pCurrent = pCurrent->pNext;}}*len = *len - 1;return ERRO_MSG; }//释放内存 int FreeAll(Student **pin/*in*/){int ERRO_MSG = 0;if (pin == NULL){ERRO_MSG = 1;printf("pin==NULL erro msg:%d\n", ERRO_MSG);return ERRO_MSG;}Student *pHead = NULL, *pCurrent = NULL, *pNext = NULL;pHead = *pin;pCurrent = pHead;if (pCurrent != NULL){while (pCurrent != NULL){pNext = pCurrent->pNext;//释放内存free(pCurrent);pCurrent = pNext;}}//避免野指针*pin = NULL;return ERRO_MSG; }
转载于:https://www.cnblogs.com/zhanggaofeng/p/5526535.html
C语言 链表的创建--打印--逆置--新增--删除--排序--释放相关推荐
- 用C++实现单链表的创建、逆置和输出 的两种方法
http://blog.csdn.net/lfeng_coding/article/details/47300563 题目描述:在已知单链表头节点的情况下,设计算法逆置单链表并输出 方法一:采用首先将 ...
- 链表创建、逆置、删除详解
*************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com ****** ...
- C 语言 链表的创建与打印
C 语言 链表的创建与打印 /* 包含的头文件 */#include <stdio.h>#include <stdlib.h>/* 定义一个表示链表的结构体指针 */struc ...
- c语言链表实现数组逆置,数组与链表等顺序表逆置
一)数组的逆置 (1)算法 #indclude #define N 8 main() { int array[N] = {100,90,80,70,60,50,50,40}; int i,j,t; ...
- 链表基础操作及其逆置
纠结了很久的一道链表题.果然我数据结构学得好渣.纠结了大约两个星期.最后提交作业的时间都截止了,还没交,再交的时候过期了,交不了了.只好跟老师说声,然后她又改了时间. 最后总结出了是我的指针和结构体学 ...
- 无头结点单链表的逆置_单链表的增删查 逆置 倒数第k个节点等问题
对于单链表而言,它没有双链表那么复杂,它只有头节点,尾节点,节点数据,后继指针.在下面本人实现了 单链表的 增 删 插 查 改. #include #include #include #i ...
- 单链表的应用 就地逆置
[问题描述]试实现线性表的就地逆置算法,即在原表的存储空间将线性表(a1,a2,a3....an)逆置为(an...a3,a2,a1). [分析]就地逆置就是不需要额外申请结点空间,只需要利用原 ...
- python实现带头结点的单链表的就地逆置_设头指针为head,编写算法实现带头结点单链表head的就地逆置...
链表问题大全!!!刚出炉的还热乎呢!! #include #include typedef struct node { int nDate; struct node *pstnext; }Node; ...
- C语言中 递归实现字符串逆置
递归图解: 每次递归时,都会创建一个字符变量C来保存字符串首位元素, 然后将字符串末尾元素赋给首位 同时字符串的起始位置都会向后推移一位,而结尾位置都会向前推移一位, 而在递归完成后,会将C中保存的字 ...
最新文章
- 综述:如何给模型加入先验知识
- 洛谷P1659 养猪
- python进阶记录之基础篇二十六_Python进阶记录之基础篇(十六)
- 如何将10元店,做到月2000万流水?
- 一张图读懂什么是专属分布式存储
- AndroidStudio安卓原生开发_UI控件_Spinner用法_下拉选择框---Android原生开发工作笔记100
- JSP自定义标签rtexprvalue属性 1
- 一些可能有用的功能cocos2dx
- Ubuntu关闭cups打印机服务
- 飞机订票系统(c语言)
- Activiti学习记录 Activiti初始化数据库、Activiti6增加表注释字段注释
- 工具-IDM(Google浏览器下载插件)
- 大江大河未来10年:中国人改变命运的的七次机遇
- 生信宝典:生物信息学习系列教程、视频教程
- goldendict for linux,GoldenDict(for Linux)配置无道词典
- MySQL学习笔记8:权限管理、数据库备份与设计
- 使用哈尔滨工业大学SCIR的开源代码训练自己的ELMo
- YUV RGB格式分析,以及对应码率(带宽)计算
- python之旅【第二篇】
- SAP BW报表使用操作手册——系统登录
热门文章
- java读取欧姆龙plc_欧姆龙CJ2M系列PLC与PLC之间的数据相互读取设定
- OPPO Find X3通过网站推广正式官宣,打破常规探索高端旗舰新突破!
- 企业日常选择网站制作公司大多从这三方面着手
- 网站优化之网站为什么要做301定向跳转?
- 搜索引擎蜘蛛抓取主要依据用户的四种行为
- 营销型网站建设需要注意哪些问题?
- 苹果8a1660是什么版本_iOS 13频繁“翻车”,果粉们面对苹果将情何以堪
- java开发一年多少钱_4年Java程序员:月薪不过3万,就不要拿命换钱了
- 计算机网络数据容量100M,华工网络教育计算机网络作业及答案
- java的mythread_java多线程 - myShadow - OSCHINA - 中文开源技术交流社区