数据结构——循环链表,双向链表,线性表和有序表的合并详解

目录

1.循环链表

1.带尾指针循环链表的合并 

代码示例:

2.双向链表

代码示例:

  1.双向链表的插入

​代码示例:

2.双向链表的删除

代码示例:

3.单链表,循环链表,双向链表时间效率的比较

4.顺序表和链表的比较

 5.存储密度

6.线性表的应用

 1.线性表的合并

​ 代码示例:

2.有序表的合并

​1.用顺序表实现

代码示例:

2.用链表实现 

代码示例:

7.案例分析

1.一元多项式的运算 

2.稀疏多项式的运算 

3.图书信息管理系统 

8.总的代码

 


1.循环链表

36a08504222f4f44ace12b32fbe571a3.jpeg

1f181792458d401ba754b4af69b57aa0.jpeg ca015c945f10479790f8eae6aaf20a76.jpeg

1.带尾指针循环链表的合并 

a6017ad0443a44c7b3166947e084b706.jpeg d479fa317aaa4bab82ea0234b13c1e44.jpeg

代码示例:

linklist connect(linklist ta,linklist tb)
{
	lnode * p;
	p = ta -> next;
	ta -> next = tb -> next -> next;
	delete tb -> next;
	tb -> next = p;
	return tb;
}

2.双向链表

89f0f3bff9fe4afeba183b78d4fb245d.jpeg 547467a793694bd283b77b973b45df48.jpeg

代码示例:

typedef struct dulnode{
	int data;
	struct dulnode *prior,*next;
}dulnode,*dulinklist;

 

865ede2639904dae801c24a34ed7a96a.jpeg 1.双向链表的插入

9a7e29064985461588fec0746ed9ab50.jpeg

36ba44ac43cb47e8887fb07bb48e2a37.jpeg 代码示例:

void insert_dul(dulinklist &l,int i,int e)
{
	if((p = getelem_dul(l,i)) == NULL) return 0;
	dulnode * s;
	s -> data = e;
	s -> prior = p -> prior;
	p -> prior -> next = s;
	s -> next = p;
	p -> prior = s;
	return 1;
}

2.双向链表的删除

0b015518e7fd4716b97c931a4b958ea6.jpeg

代码示例:

void delete_dullist(dulinklist &l,int i,int &e)
{
	dulnode *p;
	if((p = getelem_dul(l,i)) == NULL) return 0;
	e = p -> data;
	p -> prior -> next = p -> next;
	p -> next -> prior = p -> prior;
	delete p;
	return 1;
}

3.单链表,循环链表,双向链表时间效率的比较

 4adce09d472846e29009dd41fc4adf7f.png

4.顺序表和链表的比较

 70d11e5d043d418ca30c7d1216131c1b.jpeg

4418aa2b63b74d32bc8a0ea68c570e0c.png 5.存储密度

50f99ebbe4d34bf0a06c3a99fe8240ed.jpeg

6.线性表的应用

30d550749b6646e08287f14552d6f680.jpeg 1.线性表的合并

1e3f3b97b214425a8f83c8fc93b75ef8.jpeg

5b2c50fcdf064463b27e6798674036cf.jpeg 代码示例:

void union(list &la,list &lb)
{
	int la_len = listlength(la);
	int lb_len = listlength(lb);
	for(int i = 1; i <= lb_len; i ++)
	{
		int e = getelem(lb,i,e)
		//从b链表中取元素e,如果a链表中不存在元素e,就将元素e插入到链表a尾部并且让链表a长度加一
		if(!locateelem(la,e)){listinsert(&la,++la_len,e)}
	}
}

2.有序表的合并

cfc263d3202b4ee99ad0d470aab019b2.jpeg

7616cbf02c9543e28fb19e160fad034f.jpeg 1.用顺序表实现

d1998b66ff394b5ca9629206448eb51d.jpeg

 

06c1cac946654d3daf557d1db465de10.jpeg 

75e97ff3b83140048b0395935521eda4.png

代码示例:
void merge_list(sqlist la,sqlist lb,sqlist &lc)
{
	lnode *pa,*pb,*pc;
	pa = la.elem;
	pb = lb.elem;
	lc.length = la.length + lb.length;
	lc.elem = new int[lc.length];
	pc = lc.elem;
	lnode *pa_last,*pb_last
	pa_last = la.elem + la.length - 1;
	pb_last = lb.elem + lb.length - 1;
	
	while(pa <= pa_last && pb <= pb_last)
	{
		if(*pa < *pb){*pc++ = *pa++;}
		else{*pc++ = *pb++;}
	}
	
	while(pa <= pa_last) *pc++ = *pa++;
	while(pb <= pb_last) *pc++ = *pb++;
}

2.用链表实现 

8909502cd43c4f348514efb93fd06a5c.png

8a9f4f8945494eb192fdcd0d4df12b41.png

2015710684524d419063494d5624b364.png

c81591ffaa014018b543ba7f7e6ed226.png

b700923301b84fedae1f1c2266199ee9.png

代码示例:

void merge_list(linklist &la,linklist &lb,linklist &lc)
{
	lnode *pa,*pb,*pc;
	pa = la -> next;
	pb = lb -> next;
	pc = lc = la;
	while(pa != NULL && lb != NULL)
	{
		if(pa -> data <= pb -> data)
		{
			pc -> next = pa;
			pc = pa;
			pa = pa -> next;
		}
		else{
			pc -> next = pb;
			pc = pb;
			pb = pb -> next;
		}
	}
	if(pa == NULL) pc -> next = pb;
	else if(pb == NULL) pc -> next = pa;
	
	delete lb;
}

7.案例分析

1.一元多项式的运算 

9c6ec9ec1481423dbd0fdcacb1d07383.png

b4361abc1e534d0a9dc178c5aecd2bf2.png

2.稀疏多项式的运算 

d3f986d87357497692437fc8d047a3e2.png

1b722c7c3d1d43d7a147792804c31678.png

e29a8e243b234974af1d9e8109ebec54.png

c8ddac02e38e4cdca9ba9b0493854e3e.png

0ab93b5f44fc4fbf885e1da5c97cec0c.png

cfa7004cd8d54f1fbd3435374178e823.png

3.图书信息管理系统 

03bb8bb17f47419685f029cf2a93e61d.png

048c6d749b9f4f6c9055f2444f8abed7.png

69ba9ff027274aaab297ed1737a491c7.png

8.总的代码

typedef struct dulnode{
	int data;
	struct dulnode *prior,*next;
}dulnode,*dulinklist;

linklist connect(linklist ta,linklist tb)
{
	lnode * p;
	p = ta -> next;
	ta -> next = tb -> next -> next;
	delete tb -> next;
	tb -> next = p;
	return tb;
}

void insert_dul(dulinklist &l,int i,int e)
{
	dulinklist p;
	if((p = getelem_dul(l,i)) == NULL) return 0;
	dulnode * s;
	s -> data = e;
	s -> prior = p -> prior;
	p -> prior -> next = s;
	s -> next = p;
	p -> prior = s;
	return 1;
}

void delete_dullist(dulinklist &l,int i,int &e)
{
	dulnode *p;
	if((p = getelem_dul(l,i)) == NULL) return 0;
	e = p -> data;
	p -> prior -> next = p -> next;
	p -> next -> prior = p -> prior;
	delete p;
	return 1;
}

void union(list &la,list &lb)
{
	int la_len = listlength(la);
	int lb_len = listlength(lb);
	for(int i = 1; i <= lb_len; i ++)
	{
		int e = getelem(lb,i,e)
		//从b链表中取元素e,如果a链表中不存在元素e,就将元素e插入到链表a尾部并且让链表a长度加一
		if(!locateelem(la,e)){listinsert(&la,++la_len,e)}
	}
}

void merge_list(sqlist la,sqlist lb,sqlist &lc)
{
	lnode *pa,*pb,*pc;
	pa = la.elem;
	pb = lb.elem;
	lc.length = la.length + lb.length;
	lc.elem = new int[lc.length];
	pc = lc.elem;
	lnode *pa_last,*pb_last
	pa_last = la.elem + la.length - 1;
	pb_last = lb.elem + lb.length - 1;
	
	while(pa <= pa_last && pb <= pb_last)
	{
		if(*pa < *pb){*pc++ = *pa++;}
		else{*pc++ = *pb++;}
	}
	
	while(pa <= pa_last) *pc++ = *pa++;
	while(pb <= pb_last) *pc++ = *pb++;
}

void merge_list(linklist &la,linklist &lb,linklist &lc)
{
	lnode *pa,*pb,*pc;
	pa = la -> next;
	pb = lb -> next;
	pc = lc = la;
	while(pa != NULL && lb != NULL)
	{
		if(pa -> data <= pb -> data)
		{
			pc -> next = pa;
			pc = pa;
			pa = pa -> next;
		}
		else{
			pc -> next = pb;
			pc = pb;
			pb = pb -> next;
		}
	}
	if(pa == NULL) pc -> next = pb;
	else if(pb == NULL) pc -> next = pa;
	
	delete lb;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柏箱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值