C/C++,数据结构实现两个链表的合并(尾插法建立单链表,求链表长度,直接插入排序)
来源:互联网 发布:无法备案的域名 编辑:程序博客网 时间:2024/06/11 04:50
1题目
实现两个链表的合并
2基本功能要求:
1、建立两个链表A和B,链表元素个数分别为m和n个。
2、假设元素分别为(x1,x2,…xm),和(y1,y2, …yn)。把它们合并成一个线性表C,使得:
当m>=n时,C=x1,y1,x2,y2,…xn,yn,…,xm
当n>m时,C=y1,x1,y2,x2,…ym,xm,…,yn
3、输出线性表C:
用直接插入排序法对C进行升序排序,生成链表D,并输出链表D。
3测试数据:
(1)A表(30,41,15,12,56,80)
B表(23,56,78,23,12,33,79,90,55)
(2)A表(30,41,15,12,56,80,23,12,34)
B表(23,56,78,23,12)
从题目分析,首先可以将任务分模块:
1. 链表结构
2. 输出函数
3. 求链表元素个数
4. 合并
5. 直接插入排序法
其中,合并函数具体实现思路:
以测试数据(1)为例:A表数据元素 m=6,B表数据元素 n=9,此时m < n,分析合并结果,应该先插入一个B表的数据元素,在插入A表的数据元素,再插入A表的……,这样就可以得到链表,奇数位是A表数据元素,偶数位是B表数据元素。
C=23,30,56,41,78,15,23,12,12,56,33,80,79,90,55
排序结果:12,12,15,23,23,30,33,41,55,56,56,78,79,80,90
同理,测试数据(2)中
C=30,23,41,56,15,78,12,23,56,12,80,23,12,34
排序结果:12,12,12,15,23,23,23,30,34,40,56,56,78,80
模块划分
1链表头文件
主要包括链表的存储结构以及各个主要函数的声明,主要加入预处理指令,放止多次编译头文件。
2链表函数实现文件
主要是链表各个函数的实现,还有这些函数所需要的子函数的实现。
3测试主函数文件
主要包括数据操作,数据导入,测试函数。
注:本次链表传值采用值传递(下篇链表函数采用C++中的引用方法)
//***********Node.h******函数定义*********#pragma once #ifndef __NODE_H__#define __NODE_H__ //--------添加头文件-----------#include<stdio.h>#include<stdlib.h>#include<assert.h> //--------链表结构------------ typedef int DateType; //定义数据类型为 int typedef struct Node//节点类型定义{DateType data;struct Node *next;}Node, *LinkList; //--------函数-------------void InitList(LinkList *L);////初始化void CreateFromTail(LinkList L);//尾插法建立单链表void PrintLink(LinkList L);//打印链表int ListLength(LinkList L);//求链表的长度LinkList Merge(LinkList l, LinkList m);//合并两个链表void InsertSort(Node *head);//直接插入排序法排序#endif //__NODE_H_//*********Node.c****函数实现******** #include"Node.h" void InitList(LinkList *L)//初始化{*L = (LinkList)malloc(sizeof(Node));(*L)->next = NULL;} void CreateFromTail(LinkList L)//尾插法建立单链表{Node *r, *s;DateType c = 1;r = L;//scanf_s("%d", &c);//r->data = c;while (c){s = (Node*)malloc(sizeof(Node));scanf_s("%d", &c);if (c == 0){r->next = NULL;return;}s->data = c;r->next = s;r = s;} } void PrintLink(LinkList L)//打印链表{LinkList P = L->next;while (P != NULL){printf("%d ", P->data);P = P->next;}printf("\n");} int ListLength(LinkList L)//求链表长度{Node *p;p = L;int j = 0;while (p != NULL){p = p->next;j++;}return j;} void Ins(LinkList *L, DateType x)//尾插元素{Node *s;s = (Node *)malloc(sizeof(Node));s->data = x;(*L)->next = s; } LinkList Merge(LinkList l, LinkList m)//合并两个链表{Node *pl, *pm, *pls;LinkList LS;InitList(&LS);pl = l->next;pm = m->next;pls = LS;int count_l = ListLength(pl), count_m = ListLength(pm);int sum = count_l + count_m;if (count_l >= count_m){while ((pl != NULL) || (pm != NULL)){if (pl != NULL){Ins(&pls, pl->data);pl = pl->next;pls = pls->next;}if (pm != NULL){Ins(&pls, pm->data);pm = pm->next;pls = pls->next;}}} if (count_l <= count_m){while ((pl != NULL) || (pm != NULL)){if (pm != NULL){Ins(&pls, pm->data);pm = pm->next;pls = pls->next;}if (pl != NULL){Ins(&pls, pl->data);pl = pl->next;pls = pls->next;}}}pls->next = NULL;return LS;} void InsertSort(Node *head) //直接插入排序{Node *p, *pre, *q, *r;p = head->next;head->next = NULL;while (p){pre = p->next;r = head;q = head->next;while (q&&q->data<p->data){r = q;q = q->next;}p->next = r->next;r->next = p;p = pre;}} //*************test.c*****函数实现*********** #include"Node.h" void Test1(){LinkList L, M, SUM;int sum = 0;InitList(&L);InitList(&M);InitList(&SUM);printf("请输入链表L各元素的值(输入0结束)\n");CreateFromTail(L);printf("\n");printf("请输入链表M各元素的值(输入0结束)\n");CreateFromTail(M);printf("\n"); printf("链表 L =");PrintLink(L);printf("L 链表长度 %d\n", ListLength(L));printf("\n");printf("链表 M =");PrintLink(M);printf("M 链表长度= %d\n",ListLength(M));printf("\n"); SUM = Merge(L, M);printf("链表 SUM = ");PrintLink(SUM);sum = ListLength(L) + ListLength(M);InsertSort(SUM);PrintLink(SUM);} int main(){Test1();system("pause");return 0;}
- C/C++,数据结构实现两个链表的合并(尾插法建立单链表,求链表长度,直接插入排序)
- 数据结构 C语言实现直接插入排序
- 直接插入排序的c语言实现
- 数据结构之---C语言实现直接插入排序
- 数据结构c语言版之直接插入排序
- (排序)用C语言实现的直接插入排序
- 数据结构链表的操作集合(建立,遍历,插入,删除,排序,长度,空判断等)
- 【C语言】合并,排序两个链表
- C语言实现链表的创建、计算链表长度及两个链表的合并
- (数据结构排序的实验四)快速,冒泡,简单选择,直接插入排序的c语言实现!!
- C直接插入排序
- 直接插入排序.c
- C语言实现直接插入排序
- 直接插入排序(C语言实现)
- 直接插入排序Linux下c 实现
- 直接插入排序C语言实现
- C语言实现直接插入排序
- 直接插入排序算法--c语言实现
- 数据结构二叉树——建立二叉树、中序递归遍历、非递归遍历、层次遍历
- 通讯录小程序(C/C++)C语言练习小程序
- uva 129 Krypton Factor
- 最全顺序表函数(打印,初始化,后插,后删,前插,前删……)
- #pragma once和#ifndef的区别
- C/C++,数据结构实现两个链表的合并(尾插法建立单链表,求链表长度,直接插入排序)
- C/C++,数据结构单链表(采用C++"引用"方法)(寻找节点、在某处插入结点、删除某位置结点)
- PCA学习
- 遗传算法与TSP问题的MATLAB实现
- <笔试><面试>单链表相关(1)从尾到头打印链表、删除一个无头链表的非尾结点
- 笔试面试单链表相关(2)在任意位置前插入结点、逆置链表
- 笔试面试,单链表相关(3)遍历一次找中间结点、倒数第K个结点
- C/C++,数据结构单链表实现约瑟夫环
- 笔试,面试,C/C++,数据结构单链表排序(改进冒泡排序)