一、排序

编写程序,在第1题(第1题:编写程序,建立2个带头结点单链表,输入若干整数将正整数插入第1个单链表,将负整数插入第2个单链表,插入前和插入后单链表保持递增或相等次序,显示2个单链表,最后销毁。程序不可存在内存泄漏。)基础上合并2个单链表,合并前后单链表保持递增或相等次序,显示合并前后单链表。注意不可存在内存泄漏。

输入样例:

100 2 3 -2 -8 -6 -9 -10 50 2 -1

输出样例:

2->2->3->50->100
-10->-9->-8->-6->-2->-1

代码如下 :

#include <stdio.h>
#include <stdlib.h>
struct Node
{int data;struct Node *next;
};
//malloc创建新的节点
struct Node* createNew()
{struct Node *pnew;pnew = (struct Node*)malloc(sizeof(struct Node));pnew -> next = NULL;return pnew;
}
//insert
void insert(struct Node *phead,int a)
{struct Node *pold, *pnext, *p;p = createNew();p -> data = a;//第一次插入if(phead -> next == NULL) {phead -> next = p;}//插入在头节点后else {pold = phead;pnext = pold -> next;while(pnext -> data <= p -> data) {//找寻插入位置后移pold = pold -> next;pnext = pold -> next;if(pnext == NULL)//跳出循环的条件break;}//插入p -> next = pnext;pold -> next = p;}
};void print(struct Node *p)
{struct Node *afterHead;afterHead = p -> next;while(afterHead) {if(afterHead != p -> next)printf("->");printf("%d",afterHead -> data);afterHead = afterHead -> next;}printf("\n");
}
void destroy(struct Node *p)
{struct Node *pnext;while(p) {pnext = p -> next;free(p);p = pnext;}
}
int main()
{//建立两个链表的头节点struct Node *phead1, *phead2;phead1 = createNew();phead2 = createNew();//输入数据int a;do{scanf("%d",&a);a > 0 ? insert(phead1, a) : insert(phead2, a);}while(getchar() == ' ');//打印数据print(phead1);print(phead2);//销毁数据destroy(phead1);destroy(phead2);return 0;
}

二、排序+合并

编写程序,在第1题(第1题:编写程序,建立2个带头结点单链表,输入若干整数将正整数插入第1个单链表,将负整数插入第2个单链表,插入前和插入后单链表保持递增或相等次序,显示2个单链表,最后销毁。程序不可存在内存泄漏。)基础上合并2个单链表,合并前后单链表保持递增或相等次序,显示合并前后单链表。注意不可存在内存泄漏。

输入样例:

100 2 3 -2 -8 -6 -9 -10 50 2 -1

输出样例:

2->2->3->50->100
-10->-9->-8->-6->-2->-1
-10->-9->-8->-6->-2->-1->2->2->3->50->100

代码如下:

#include <stdio.h>
#include <stdlib.h>
struct Node
{int data;struct Node *next;
};
//malloc创建新的节点
struct Node* createNew()
{struct Node *pnew;pnew = (struct Node*)malloc(sizeof(struct Node));pnew -> next = NULL;return pnew;
}
//insert
void insert(struct Node *phead,int a)
{struct Node *pold, *pnext, *p;p = createNew();p -> data = a;//第一次插入if(phead -> next == NULL) {phead -> next = p;}//插入在头节点后else {pold = phead;pnext = pold -> next;while(pnext -> data <= p -> data) {//找寻插入位置后移pold = pold -> next;pnext = pold -> next;if(pnext == NULL)//跳出循环的条件break;}//插入p -> next = pnext;pold -> next = p;}
};
void print(struct Node *p)
{struct Node *afterHead;afterHead = p -> next;while(afterHead) {if(afterHead != p -> next)printf("->");printf("%d",afterHead -> data);afterHead = afterHead -> next;}printf("\n");
}
void destroy(struct Node *p)
{struct Node *pnext;while(p) {pnext = p -> next;free(p);p = pnext;}
}
int main()
{//建立两个链表的头节点struct Node *phead1, *phead2;phead1 = createNew();phead2 = createNew();//输入数据int a;do{scanf("%d",&a);a > 0 ? insert(phead1, a) : insert(phead2, a);}while(getchar() == ' ');//打印数据print(phead1);print(phead2);// 合并链表struct Node *L = phead2;struct Node *pnew = L;while (pnew->next) pnew = pnew->next;  // 最终p为L链表最后一个结点pnew->next = phead1->next, phead1->next = NULL;destroy(phead1);print(L);destroy(L);return 0;
}

三、排序+逆序

在第1题( 编写程序,建立2个带头结点单链表,输入若干整数将正整数插入第1个单链表,将负整数插入第2个单链表,插入前和插入后单链表保持递增或相等次序,显示2个单链表,最后销毁。程序不可存在内存泄漏。)建立2个单链表基础上,设计和实现就地逆置单链表函数,即利用原单链表结点建立元素次序相反的单链表。编写程序,建立2个单链表,就地逆置这2个单链表,显示逆置前后的各单链表。注意不可存在内存泄漏。

输入样例:

100 2 3 -2 -8 -6 -9 -10 50 2 -1

输出样例:

2->2->3->50->100
-10->-9->-8->-6->-2->-1
100->50->3->2->2
-1->-2->-6->-8->-9->-10

代码如下:

#include <stdio.h>
#include <stdlib.h>
struct Node
{int data;struct Node *next;
};
//malloc创建新的节点
struct Node* createNew()
{struct Node *pnew;pnew = (struct Node*)malloc(sizeof(struct Node));pnew -> next = NULL;return pnew;
}
//insert
void insert(struct Node *phead,int a)
{struct Node *pold, *pnext, *p;p = createNew();p -> data = a;//第一次插入if(phead -> next == NULL) {phead -> next = p;}//插入在头节点后else {pold = phead;pnext = pold -> next;while(pnext -> data <= p -> data) {//找寻插入位置后移pold = pold -> next;pnext = pold -> next;if(pnext == NULL)//跳出循环的条件break;}//插入p -> next = pnext;pold -> next = p;}
};void print(struct Node *p)
{struct Node *afterHead;afterHead = p -> next;while(afterHead) {if(afterHead != p -> next)printf("->");printf("%d",afterHead -> data);afterHead = afterHead -> next;}printf("\n");
}struct Node *reverse(struct Node *phead) {struct Node *pafter, *pnext;pafter = phead -> next;while(pafter) {if(pafter == phead -> next) {pnext = pafter -> next;pafter -> next = NULL;pafter = pnext;}else {pnext = pafter -> next;pafter -> next = phead -> next;phead -> next = pafter;pafter = pnext;}}return phead;
}
void destroy(struct Node *p)
{struct Node *pnext;while(p) {pnext = p -> next;free(p);p = pnext;}
}
int main()
{//建立两个链表的头节点struct Node *phead1, *phead2;phead1 = createNew();phead2 = createNew();//输入数据int a;do{scanf("%d",&a);a > 0 ? insert(phead1, a) : insert(phead2, a);}while(getchar() == ' ');//打印数据print(phead1);print(phead2);//逆序phead1 = reverse(phead1);phead2 = reverse(phead2);//打印逆序后的链表print(phead1);print(phead2);//销毁数据destroy(phead1);destroy(phead2);return 0;
}

四、 排序+分离

编写程序,输入若干正整数,按从小到大次序建立1个带头结点单链表,设计一个实现单链表分离算法的Split函数,将原单链表中值为偶数的结点分离出来形成一个新单链表,新单链表中头结点重新申请,其余结点来自原链表,分离后,原链表中只剩非偶数值所在结点,最后显示2个单链表,在程序退出前销毁单链表。要求Split算法时间复杂性达到O(n),程序不可存在内存泄漏。

输入样例:

100 2 3  50 2 1 5 8

输出样例:

1->2->2->3->5->8->50->100
1->3->5
2->2->8->50->100
#include <stdio.h>
#include <stdlib.h>struct Node {int data;struct Node* next;};//createNew
struct Node *createNew() {struct Node *p;p = (struct Node *)(malloc(sizeof(struct Node)));p -> next = NULL;return p;};//insert
struct Node *insert(struct Node *phead, int a) {struct Node *p, *pold, *pnext;p = createNew();p -> data = a;if(!(phead -> next))phead -> next = p;else {pold = phead;pnext = pold -> next;while(p -> data > pnext -> data) {pold = pold -> next;pnext = pold -> next;if(!pnext)break;}p -> next = pnext;pold -> next = p;}return phead;};//split
void split(struct Node **pp1,struct Node **pp2) {struct Node *phead1, *phead2;struct Node *pnext, *ptail, *pold;phead1 = *pp1;phead2 = *pp2;pnext = phead1 -> next;pold = phead1;while(pnext) {if(pnext -> data % 2 == 0) {if(!(phead2 -> next)) {phead2 -> next = pnext;ptail = phead2 -> next;}else {ptail -> next = pnext;ptail = ptail -> next;}pnext = pnext -> next;pold -> next = pnext;}else {pold = pnext;pnext = pnext -> next;}}};//print
void print(struct Node *p)
{struct Node *afterHead;afterHead = p -> next;while(afterHead) {if(afterHead != p -> next)printf("->");printf("%d",afterHead -> data);afterHead = afterHead -> next;}printf("\n");
}//destroy
void destroy(struct Node *p)
{struct Node *pnext;while(p) {pnext = p -> next;free(p);p = pnext;}
}int main()
{//创建俩个链表struct Node *origin, *pnew;origin = createNew();pnew = createNew();int a;do {//输入数据scanf("%d",&a);//插入数据进行排序origin = insert(origin,a);}while(getchar() == ' ');//打印原链表print(origin);//分离链表split(&origin,&pnew);//打印print(origin);print(pnew);//销毁destroy(origin);destroy(pnew);return 0;
}

【C语言】单向链表排序、合并、逆序、分离(链表的头节点不储存数据)相关推荐

  1. SDUT _2117 数据结构实验之链表二:逆序建立链表

    点击打开链接 数据结构实验之链表二:逆序建立链表 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem D ...

  2. 数据结构实验之链表二:逆序建立链表

    题目描述 输入整数个数N,再输入N个整数,按照这些整数输入的相反顺序建立单链表,并依次遍历输出单链表的数据. 输入 第一行输入整数N;: 第二行依次输入N个整数,逆序建立单链表. 输出 依次输出单链表 ...

  3. 单链表逆置 java_单链表的就地逆置--java实现(含头节点和不包含头节点)

    前沿:链表是面试中经常问道的知识点,比如链表反转,就地反转,判断单链表是否相交,判断链表是否有环等都是常问的问题.今天说一下单链表就地反转. 本文从包含头节点和不包含头节点两种链表都提供了相应的就地反 ...

  4. python单向链表逆序_链表逆序-Python实现

    题目描述: 给定一个带头节点的单链表,将其逆序.即如果单链表原来为head->1->2->3->4->5->6->7,那么逆序后变为head->7-&g ...

  5. 链表逆序 java_链表逆序(JAVA实现)

    题目:将一个有链表头的单向单链表逆序 分析: 链表为空或只有一个元素直接返回: 设置两个前后相邻的指针p,q,使得p指向的节点为q指向的节点的后继: 重复步骤2,直到q为空: 调整链表头和链表尾: 图 ...

  6. 恢复博客更新 --- 逆序单项链表 要求空间复杂度o(1) 时间复杂度o(n)

    转眼已经2016年3月1日了,前一阵子忙了很多事,包括下决心换了工作,也算是正式进了互联网行业.现在后头想想,人必须趁着有时间有精力时多折腾,毕竟人生短短几十年,如果不折腾以后肯定会后悔. 今天开始恢 ...

  7. 【链表】逆序打印链表

    1 public class Main { 2 3 // 逆序打印链表 4 public void reversePrint(Node node) { 5 if (node == null){ 6 r ...

  8. java数组逆序_Java 数组的排序、逆序

    数组的排序.逆序测试数据 public static void main (String[] args) { // 数组逆序 int[] arr = {1,2,3,4,5,6,7}; reverse( ...

  9. excel中条形图的条目排序与逆序

    excel中条形图的条目排序与逆序 在excel中创建一个条形图,经常会出现这样的情况,假设你的表格是: a  1 b  2 c  3 d  4 但是默认的条形图从上到下的条目顺序是dcba,纠结得很 ...

最新文章

  1. python的深拷贝与浅拷贝
  2. 惊呆,一条sql竟然让oracle奔溃了
  3. asp.net MVC 中 Session统一验证的方法
  4. 解决Hibernate报错The server time zone value is unrecognized or represents more than one time zone
  5. PCB Genesis脚本 C#调用Javascript
  6. C++标准(Standard for ProgrammingLanguage C++)
  7. eclipse python_一文教你配置得心应手的Python
  8. 【2020CCPC秦皇岛:C】Cameraman(计算几何+思维+枚举)
  9. 【Fiddler抓包】Fiddler基础用法-基于Fiddler5中文汉化版
  10. Android基础入门教程——4.1.1 Activity初学乍练
  11. 神推荐:酷站导航你值得拥有
  12. 信息 按顺序打印commit_风火快递单打印软件按导入数据顺序批量打印,但打出来的顺序和导入的表格里的?...
  13. 每个汉字在DB2数据库中占多少个字节?
  14. c语言编程一对新出生的兔子,C语言 有一对兔子。从出生后第三个月起每个月都生一对兔子,小兔子长到三个月后又生一对小兔子,假如兔子都不死,问每个月的兔子总数为多少。...
  15. 粉笔网页端资料分析仿ipad分屏插件开发完成总结
  16. 计算机房灭火器单具基准,厂房、车间灭火器配置计算范例
  17. 模糊查询银行卡号mysql_mysql模糊查询
  18. Excel匹配两列相同内容到同一行
  19. 通过redis-cli批量删除多个指定模式的key
  20. 直觉模糊犹豫集结算子的多属性决策方法及matlab应用

热门文章

  1. Mysql 时间戳转换 FROM_UNIXTIME(unix_timestamp,format)
  2. 数字经济时代的智能化大数据治理
  3. 基于web的前后端分离nodejs和vue.js医院分诊系统
  4. 主流分布式架构的风流韵事...
  5. .NET CORE 5.0 MVC 获取wwwroot路径
  6. 不让Win10重置“默认应用” 你要保证做到这几点
  7. 网页与浏览器的关系(0)
  8. 真实评测:天玑1000+相当于骁龙什么处理器-联发科天玑1000+处理器相当于骁龙多少
  9. 【金猿产品展】OceanBase 原生分布式数据库——从根本上解决海量数据管理的问题...
  10. 2022 全栈开发值得关注的技术产品