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
#include
#include
 
//--------链表结构------------
 
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->datadata)
{
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++,数据结构实现两个链表的合并(尾插法建立单链表,求链表长度,直接插入排序)..._第1张图片