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)                          

2A表(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;}

wKioL1aHXCHgG260AABgRu-qVvc950.png

0 0
原创粉丝点击