数据结构(严蔚敏)算法2.8-2.12实现

#include <iostream>
#include "define.h"
#include <malloc.h>
using namespace std;
//工具函数
void ShowList(LinkList *L)
{
	if(!L){ cout<<"error"<<endl;exit;}
	LinkList *p=L->next;
	while(p)
	{
		cout<<p->data<<" ";
		p=p->next;
	}
}
//算法2,8-2.17
Status GetElem(LinkList* L,int i,ElemType& e)//算法2.8
{
	//L为带头结点的单链表的头指针。
	//当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
	LinkList *p=L->next;int j=1;//初始化,P指向第一个结点,j为计数器
	while(p&&j<i)//顺指针先后查找,直到p指向第i个元素或p为空
	{
		p=p->next;++j;
	}
	if(!p||j>i)return 0;
	e=p->data;
	return 1;
}

Status ListInsert(LinkList* L,int i,ElemType e)//算法2.9
{
	//在带头结点的单链表L中第i个位置之前插入元素e
	LinkList* p=L;int j=0;
	while(p&&j<i-1)
	{
		p=p->next;++j;//寻找第i-1个结点
	}
	if(!p||j>i-1) return 0;//i小于1或者大于表长+1
	LinkList* s=(LinkList*)malloc(sizeof(LinkList));//生成新结点
	s->data=e;s->next=p->next;//插入L中
	p->next=s;
}
Status ListDelete(LinkList* L,int i,ElemType& e)//算法2.10
{
	//在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
	LinkList*p=L;int j=0;
	while(p&&j<i-1)//寻找第i个结点,并令p指向其前驱
	{
		p=p->next;++j;
	}
	if(!(p)||j>i-1) return 0;//删除位置不合理
	LinkList* q;
	q=p->next;p->next=q->next;//删除并释放结点
	e=q->data;free(q);
	return 1;
}
LinkList* CreateList(int n)//算法2.11
{
	//逆位序输入n个元素的值,建立带表头结点的单链线性表L。
	LinkList *L=(LinkList*)malloc(sizeof(LinkList));
	L->next=NULL;//先建立一个带头结点的单链表
	for(int i=n;i>0;--i)
	{
		LinkList* p=(LinkList *)malloc(sizeof(LinkList));//生成新结点
		cin>>p->data;//输入元素值
		p->next=L->next;L->next=p;//插入到表头
	}
	cout<<"长度为"<<n<<"的链表建立成功"<<endl;
	return L;
}
void MetgeList(LinkList *La,LinkList *Lb,LinkList *Lc)//算法2.12
{
	//已知单链线性表La和Lb的元素按值非递减排列。
	//归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列。
	LinkList* pa=La->next;LinkList * pb=Lb->next;
	*Lc=*La;LinkList*pc=Lc;
	while(pa&&pb)
	{
		if(pa->data<=pb->data)
		{
			pc->next=pa;pc=pa;pa=pa->next;
		}
		else
		{
			pc->next=pb;pc=pb;pb=pb->next;
		}
	}
	pc->next=pa?pa:pb;
	free(Lb);
}
#include <iostream>
#include "define.h"
#include <malloc.h>
using namespace std;
int main()
{
	//建立一个链表 ahead->1|&a2->2|&a3->3|&a4->4|&a5->5|NULL;1 2 3 4 5
	LinkList head0,a1,a2,a3,a4,a5;
	LinkList* ahead=&head0;
	head0.next=&a1;
	a1.data=1,a1.next=&a2;
	a2.data=2,a2.next=&a3;
	a3.data=3,a3.next=&a4;
	a4.data=4,a4.next=&a5;
	a5.data=5,a5.next=NULL;

	//测试算法2.8
	cout<<'\n'<<"开始测试"<<"##算法2.8##"<<endl;
	int e1,i1;
	cout<<"请输入你想查找的第i个数据元素"<<endl;
	cin>>i1;
	if(GetElem(ahead,i1,e1))cout<<"第"<<i1<<"个元素为"<<e1<<endl;
	else cout<<"异常退出"<<endl;
	cout<<"测试完毕"<<"##算法2.8##"<<endl;

	//测试算法2.9
	cout<<'\n'<<"开始测试"<<"##算法2.9##"<<endl;
	int e2,i2;
	cout<<"插入前的链表为:";ShowList(ahead);
	cout<<"请输入你要插入的位置及数字"<<endl;
	cin>>i2>>e2;
	if(ListInsert(ahead,i2,e2)) 
	{
		cout<<"插入成功!插入后的链表为:";ShowList(ahead);
	}
	else cout<<"插入失败"<<endl;
	cout<<'\n'<<"测试完毕"<<"##算法2.9##"<<endl;

	//测试算法2.11
	cout<<'\n'<<"开始测试"<<"##算法2.11##"<<endl;
	cout<<"创建一个长度为5的链表,并输入数据"<<endl;
	LinkList* L1=CreateList(5);
	cout<<"链表创建成功!数据元素分别为"<<endl;
	ShowList(L1);
	cout<<'\n'<<"测试完毕"<<"##算法2.11##"<<endl;

	//测试算法2.10
	cout<<'\n'<<"开始测试"<<"##算法2.10##"<<endl;
	int e3,i3;
	cout<<"插入前的链表为:";ShowList(L1);
	cout<<"请输入你要删除的位置"<<endl;
	cin>>i3;
	if(ListDelete(L1,i3,e3)) 
	{
		cout<<"删除成功!删除的数字是"<<e3<<'\n'<<"删除后的链表为:";ShowList(L1);
	}
	else cout<<"删除失败"<<endl;
	cout<<'\n'<<"测试完毕"<<"##算法2.10##"<<endl;

	//测试算法2.12
	cout<<'\n'<<"开始测试"<<"##算法2.12##"<<endl;
	cout<<"请输入值非递减排列"<<endl;
	LinkList *La=CreateList(5);
	LinkList *Lb=CreateList(3);
	cout<<"请输入值非递减排列"<<endl;
	LinkList *Lc=CreateList(0);
	MetgeList(La,Lb,Lc);
	cout<<"合并后的链表为:";ShowList(Lc);
	cout<<'\n'<<"测试完毕"<<"##算法2.12##"<<endl;
	return 0;
}

结果:

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值