合并列表
线性表链式存储实验3 有升序链式存储的顺序表LA,存放字符‘a’,‘c’, ‘e’, ‘g’ 和LB存放字符‘a’, ‘b’,‘d’,‘f’。现通过合并算法,将两个链表合并,要求合并后仍为非降序,然后输出合并后的链表。 答案要求: 1、将运行结果截图贴在答案框,注意不要全屏截图,以保证清晰 2、将main()方法的代码贴入答案框 3、将整个项目的代码压缩,以附件形式上传
common.c
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<time.h> //用于设置随机数种子用
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#include"common.h"
typedef char ElemType; //链表数据结点中为字符类型
//链表结构定义
typedef struct Node
{
ElemType data; //数据域
struct Node *next; //指针域
}Node,*LinkList; //两个类型名字:Node用于定义结点,LinkList用于定义链表
//算法功能:初始化单链表
void InitList(LinkList *L);
//算法功能:输出链表内容
void PrintList(LinkList L);
//算法功能:头插法建立单链表
void CreateFromHead(LinkList L);
//算法功能:尾插法建立单链表
void CreateFromTail(LinkList L);
//算法功能:在单链表L中查找第i个结点
Node * Get(LinkList L,int i);
//算法功能:在单链表L中查找值为Key的结点
Node * Locate(LinkList L,ElemType key);
//算法功能:单链表插入操作算法 ,在第i个位置插入e
void InsList(LinkList L,int i,ElemType e);
//算法功能:删除单链表中第i个结点
int DelList(LinkList L,int i,ElemType *e);
//算法:两个有序单链表的合并
LinkList MergeLinkList(LinkList LA, LinkList LB);
#include"linklist.h"
//对单链表进行初始化
void InitList(LinkList *L)
{
*L=(LinkList)malloc(sizeof(Node));
(*L)->next=NULL; //空链表
}
//算法功能:输出链表内容
void PrintList(LinkList L)
{
Node *p;
p=L->next; //p指向首结点
while(p!=NULL)
{
printf("%C->",p->data); //输出当前值域
p=p->next; //指针指向下一个结点
}
}
//尾插法建立单链表
void CreateFromTail (LinkList L)
{ Node *s,*r; //*s 要插入的临时结点,r指针指向尾结点
char c;
int flag=1;
r=L; //初始链表为空 ,尾r和头指针L指向相同地址
while(flag)
{ c=getchar(); //读取一个字符,回车为止,存入c
if(c!=’$’)
{ s=(Node)malloc(sizeof(Node)); //分配存储空间
s->data=c;
r->next=s; //尾结点指向s
r=s; //移动尾指针,指向新加入的s
}
else
{ flag=0;
r->next=NULL; //结束时尾结点next置空
}
}
}
//算法:两个有序单链表的合并
LinkList MergeLinkList(LinkList LA, LinkList LB)
{
Node *pa,*pb,*r; //定义变量
LinkList LC;
pa=LA->next; //pa指向单链表LA的第一个结点
pb=LB->next; //pb指向单链表LB的第一个结点
LC=LA; //将LA头结点空间给LC使用,以节约空间
LC->next=NULL;
r=LC; //r始终指向LC的表尾
//分别遍历两个链表, 将较小的值使用尾插法链入LC中
while(pa!=NULL && pb!=NULL)
{
if(pa->data <= pb->data)
{
r->next=pa; //如果pa比较小,则链入
r=pa; //r前进,指向链尾
pa=pa->next; //pa指针移动到下一个结点
}
else
{
r->next=pb;
r=pb;
pb=pb->next;
}
}
//如果LA或LB有剩下的结点,则直接链入LC(r)后
if(pa!=NULL)
r->next=pa;
else
r->next=pb;
free(LB) ; //释放LB头结点,
return(LC);
}
#include"linklist.h"
//对单链表进行初始化
void InitList(LinkList *L)
{
*L=(LinkList)malloc(sizeof(Node));
(*L)->next=NULL; //空链表
}
//算法功能:输出链表内容
void PrintList(LinkList L)
{
Node *p;
p=L->next; //p指向首结点
while(p!=NULL)
{
printf("%C->",p->data); //输出当前值域
p=p->next; //指针指向下一个结点
}
}
//尾插法建立单链表
void CreateFromTail (LinkList L)
{ Node *s,*r; //*s 要插入的临时结点,r指针指向尾结点
char c;
int flag=1;
r=L; //初始链表为空 ,尾r和头指针L指向相同地址
while(flag)
{ c=getchar(); //读取一个字符,回车为止,存入c
if(c!=’$’)
{ s=(Node)malloc(sizeof(Node)); //分配存储空间
s->data=c;
r->next=s; //尾结点指向s
r=s; //移动尾指针,指向新加入的s
}
else
{ flag=0;
r->next=NULL; //结束时尾结点next置空
}
}
}
//算法:两个有序单链表的合并
LinkList MergeLinkList(LinkList LA, LinkList LB)
{
Node *pa,*pb,*r; //定义变量
LinkList LC;
pa=LA->next; //pa指向单链表LA的第一个结点
pb=LB->next; //pb指向单链表LB的第一个结点
LC=LA; //将LA头结点空间给LC使用,以节约空间
LC->next=NULL;
r=LC; //r始终指向LC的表尾
//分别遍历两个链表, 将较小的值使用尾插法链入LC中
while(pa!=NULL && pb!=NULL)
{
if(pa->data <= pb->data)
{
r->next=pa; //如果pa比较小,则链入
r=pa; //r前进,指向链尾
pa=pa->next; //pa指针移动到下一个结点
}
else
{
r->next=pb;
r=pb;
pb=pb->next;
}
}
//如果LA或LB有剩下的结点,则直接链入LC(r)后
if(pa!=NULL)
r->next=pa;
else
r->next=pb;
free(LB) ; //释放LB头结点,
return(LC);
}