您的位置:首页 > 理论基础 > 数据结构算法

C/C++,数据结构实现两个链表的合并(尾插法建立单链表,求链表长度,直接插入排序)

2016-01-02 13:18 771 查看


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;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息