#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语言 链表的创建--打印--逆置--新增--删除--排序--释放相关推荐

  1. 用C++实现单链表的创建、逆置和输出 的两种方法

    http://blog.csdn.net/lfeng_coding/article/details/47300563 题目描述:在已知单链表头节点的情况下,设计算法逆置单链表并输出 方法一:采用首先将 ...

  2. 链表创建、逆置、删除详解

    *************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com ****** ...

  3. C 语言 链表的创建与打印

    C 语言 链表的创建与打印 /* 包含的头文件 */#include <stdio.h>#include <stdlib.h>/* 定义一个表示链表的结构体指针 */struc ...

  4. c语言链表实现数组逆置,数组与链表等顺序表逆置

    一)数组的逆置 (1)算法 #indclude #define N  8 main() { int array[N] = {100,90,80,70,60,50,50,40}; int i,j,t; ...

  5. 链表基础操作及其逆置

    纠结了很久的一道链表题.果然我数据结构学得好渣.纠结了大约两个星期.最后提交作业的时间都截止了,还没交,再交的时候过期了,交不了了.只好跟老师说声,然后她又改了时间. 最后总结出了是我的指针和结构体学 ...

  6. 无头结点单链表的逆置_单链表的增删查 逆置 倒数第k个节点等问题

    对于单链表而言,它没有双链表那么复杂,它只有头节点,尾节点,节点数据,后继指针.在下面本人实现了 单链表的 增   删   插  查  改. #include #include #include #i ...

  7. 单链表的应用 就地逆置

    [问题描述]试实现线性表的就地逆置算法,即在原表的存储空间将线性表(a1,a2,a3....an)逆置为(an...a3,a2,a1).    [分析]就地逆置就是不需要额外申请结点空间,只需要利用原 ...

  8. python实现带头结点的单链表的就地逆置_设头指针为head,编写算法实现带头结点单链表head的就地逆置...

    链表问题大全!!!刚出炉的还热乎呢!! #include #include typedef struct node { int nDate; struct node *pstnext; }Node; ...

  9. C语言中 递归实现字符串逆置

    递归图解: 每次递归时,都会创建一个字符变量C来保存字符串首位元素, 然后将字符串末尾元素赋给首位 同时字符串的起始位置都会向后推移一位,而结尾位置都会向前推移一位, 而在递归完成后,会将C中保存的字 ...

最新文章

  1. 综述:如何给模型加入先验知识
  2. 洛谷P1659 养猪
  3. python进阶记录之基础篇二十六_Python进阶记录之基础篇(十六)
  4. 如何将10元店,做到月2000万流水?
  5. 一张图读懂什么是专属分布式存储
  6. AndroidStudio安卓原生开发_UI控件_Spinner用法_下拉选择框---Android原生开发工作笔记100
  7. JSP自定义标签rtexprvalue属性 1
  8. 一些可能有用的功能cocos2dx
  9. Ubuntu关闭cups打印机服务
  10. 飞机订票系统(c语言)
  11. Activiti学习记录 Activiti初始化数据库、Activiti6增加表注释字段注释
  12. 工具-IDM(Google浏览器下载插件)
  13. 大江大河未来10年:中国人改变命运的的七次机遇
  14. 生信宝典:生物信息学习系列教程、视频教程
  15. goldendict for linux,GoldenDict(for Linux)配置无道词典
  16. MySQL学习笔记8:权限管理、数据库备份与设计
  17. 使用哈尔滨工业大学SCIR的开源代码训练自己的ELMo
  18. YUV RGB格式分析,以及对应码率(带宽)计算
  19. python之旅【第二篇】
  20. SAP BW报表使用操作手册——系统登录

热门文章

  1. java读取欧姆龙plc_欧姆龙CJ2M系列PLC与PLC之间的数据相互读取设定
  2. OPPO Find X3通过网站推广正式官宣,打破常规探索高端旗舰新突破!
  3. 企业日常选择网站制作公司大多从这三方面着手
  4. 网站优化之网站为什么要做301定向跳转?
  5. 搜索引擎蜘蛛抓取主要依据用户的四种行为
  6. 营销型网站建设需要注意哪些问题?
  7. 苹果8a1660是什么版本_iOS 13频繁“翻车”,果粉们面对苹果将情何以堪
  8. java开发一年多少钱_4年Java程序员:月薪不过3万,就不要拿命换钱了
  9. 计算机网络数据容量100M,华工网络教育计算机网络作业及答案
  10. java的mythread_java多线程 - myShadow - OSCHINA - 中文开源技术交流社区