#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;
}
数据结构(严蔚敏)算法2.8-2.12实现
最新推荐文章于 2024-07-25 02:49:15 发布