标签:数据结构 c/c++ 实现两个链表的合并课程设计 含测试函数
实现两个链表的合并
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。
(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
模块划分
主要包括链表的存储结构以及各个主要函数的声明,主要加入预处理指令,放止多次编译头文件。
主要是链表各个函数的实现,还有这些函数所需要的子函数的实现。
主要包括数据操作,数据导入,测试函数。
注:本次链表传值采用值传递(下篇链表函数采用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++ 实现两个链表的合并课程设计 含测试函数
原文地址:http://10739786.blog.51cto.com/10729786/1730843