目录
实验性质:设计性实验
要求
(1)编程实现单链表的以下基本操作:建立单链表,查找单链表,插入单链表,删除单链表。
(2)采用单链表结构编程实现:两个有序单链表的归并运算。
目的:
(1)掌握线性表的链式存储结构;
(2)掌握单链表及其基本操作的实现。
代码
#include <iostream>
using namespace std;
typedef int ElemType;
//定义结点存储结构
typedef struct LNode
{
ElemType data; //数据域
struct LNode *next; //指针域
}LNode,*LinkList;
void InitList(LinkList &L); //单链表的初始化
void InsertList(LinkList &L,int i,int x,bool y);//单链表的插入
void DeleteList(LinkList &L,int i); //删除指定位置的元素
void Display(LinkList &L); //显示单链表
void LocateElem(LinkList &L,int x); //查找
void CreateTwoList(LinkList &LA,LinkList &LB); //生成两个单链表
void MergeList(LinkList &LA,LinkList &LB,LinkList &LC); //合并有序单链表
void Menu(); //文字菜单提示信息
int main()
{
LinkList L;LinkList LA;LinkList LB;LinkList LC;
Menu();
InitList(L);
int h,k; //获取输入的指定位置和插入数据的元素
int i; //输入的数字
cout<<"请输入操作代码:";
cin>>i;
while(true)
{
switch(i)
{
case 1:
cout<<"输入要操作的位置:";
cin>>h;
cout<<"输入要插入的值:";
cin>>k;
InsertList(L,h,k,true);
break;
case 2:
cout<<"输入要操作的位置:";
cin>>h;
DeleteList(L,h);
break;
case 3:
Display(L);
break;
case 4:
cout<<"输入要操作的值:";
cin>>k;
LocateElem(L,k);
break;
case 5:
CreateTwoList(LA,LB);
break;
case 6:
MergeList(LA,LB,LC);
break;
default:
if(i<0)
return 0;
else
{
cout<<"输入的位置非法,请重新输入";
break;
}
}
cout<<"请输入操作代码:";
cin>>i;
}
return 0;
}
void InitList(LinkList &L)//初始化
{
L=new LNode;
L->next=NULL;
}
void InsertList(LinkList &L,int i,int x,bool y)//插入单链表
{
LNode *p=L; int j=0;
while(p && (j<i-1))
{
p=p->next;
++j;
}
if(!p||j>i-1)
cout<<"输入的位置非法"<<endl;
else
{
LNode *s;
s=new LNode;
s->data=x;
s->next=p->next;
p->next=s;
if(y)
cout<<"插入元素成功"<<endl;
}
}
void DeleteList(LinkList &L,int i)//删除指定元素
{
LNode *p=L;int j=0;
while((p->next) && (j<i-1))
{
p=p->next;
++j;
}
if(!(p->next)||(j>i-1))
cout<<"输入的位置非法"<<endl;
else
{
LNode *q=p->next;
p->next=q->next;
delete q;
cout<<"元素删除成功"<<endl;
}
}
void Display(LinkList &L)//显示单链表
{
LNode *p=L->next;
if(!p)
{
cout<<"当前单链表为空"<<endl;
return;
}
cout<<"单链表元素为:";
while(p)
{
if(p->next)
cout<<p->data<<",";
else
cout<<p->data<<endl;
p=p->next;
}
}
void LocateElem(LinkList &L,int x)
{
LNode *p=L->next;
while(p && p->data!=x)
p=p->next;
if(p)
cout<<"成功找到元素"<<endl;
else
cout<<"元素不存在"<<endl;
}
void CreateTwoList(LinkList &LA,LinkList &LB)
{
InitList(LA);
InitList(LB);
InsertList(LA,1,2,false);InsertList(LA,2,4,false);InsertList(LA,3,5,false);
InsertList(LB,1,3,false);InsertList(LB,2,5,false);InsertList(LB,3,7,false);
cout<<"成功创建两个单链表"<<endl;
cout<<"LA为";Display(LA);
cout<<"LB为";Display(LB);
}
void MergeList(LinkList &LA,LinkList &LB,LinkList &LC)
{
LNode *pa=LA->next;LNode *pb=LB->next;
LC=LA;
LNode *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;
delete LB;
cout<<"合并成功,LC";
Display(LC);
}
void Menu()
{
cout << "1-----在单链表指定位置插入元素 "<< endl;
cout << "2-----删除单链表指定位置元素" << endl;
cout << "3-----显示单链表" << endl;
cout << "4-----查找元素" << endl;
cout << "5-----自动创建两个单链表" << endl;
cout << "6-----合并两个单链表" << endl;
cout << " 退出,输入一个负数!" << endl;
}
写在最后
本文章仅供个人复习使用,如有错误,请联系我更正。