链表实现与应用

合并列表

线性表链式存储实验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);

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值