C++链表实验
·
仅供参考!
代码:
#include <iostream>
#include <stdlib.h>
#include <conio.h>
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define LEN sizeof(Lnode)
using namespace std;
static int flag=0;
typedef struct Lnode{
int data; //一区域
struct Lnode *next;
}Lnode, *Linklist; //??
void InitList (Linklist *L) {
Linklist p;
p = (Linklist)malloc(sizeof(Lnode)); //申请空间
if(p == NULL)
cout << "申请内存空间失败。" << endl;
p->next=NULL; //表头地址区 初始为null
*L = p;
flag++;
} //初始化一个空的链表
void Creatlist(Linklist L,int n)
{
int i;
Lnode *p,*pt;
pt=L;
for(i=1;i<=n;i++)
{
p=(Linklist)malloc(sizeof(Lnode)); //建立节点
if(p==NULL) //判断是否成功
cout << "申请内存空间失败。" << endl;
cout << "请输入链表中元素:" << endl;
cin >> p->data;
p->next=pt->next;
pt->next=p;
pt=p; // 连接节点
}
//flag++;
}//创建链表
int DestroyList(Linklist L)//销毁链表
{
Lnode *p;
p=NULL;
if(L && flag!=0)
{
while(L)
{
p=L;
L=L->next;
free(p);
}
cout << "链表已销毁。" << endl;
}
else
cout << "链表不存在。" << endl;
return OK;
flag++;
}
int Getelem(Linklist L, int i)
{
Lnode *p;
int e; //用e返回L中第i个数据元素的值
int j;
p=L->next;j=1;
while (p && j<i)
{
p=p->next;
++j;
} //确定节点位置
if(!p || j>i)
cout << "该位序不存在。" << endl;
else
{
e=p->data;
cout << "第" << i << "个元素为:" << e << endl;
}
return OK;
}
void LocateElem(Linklist L,int *e)
{
Lnode *p;
int i=1; //输出与条件相符的元素的位序.
p=L->next;
while(p!=NULL)
{
if(p->data==*e) //判断是否存在,然后逐个对比
{
cout << "元素" << *e <<"的位序是:" << i << endl;
break;
}
p=p->next;
i++;
}
if(p==NULL)
cout << "该元素不存在。" << endl;
}
void PriorElem(Linklist L,int e)
{
Lnode *p,*pt;
int i=0;
p=L->next;
while(p!=NULL)
{
if(p->data==e && i!=0) //找到元素
{
cout << "该元素的直接前驱是:" << pt->data << endl;
break;//求元素的直接前驱.
}
else if(p->data==e && i==0) //确定不是第一个
{
cout << "该元素没有直接前驱。" << endl;
break;
}
pt=p;
p=p->next;
i++;
}
if(p==NULL)
cout << "该元素不存在。" << endl;
}
void NextElem(Linklist L,int e)//求元素的直接后继。
{
Lnode *p;
p=L->next;
while(p!=NULL)
{
if(p->data==e)
{
if(p->next!=NULL)
cout << "该元素的直接后继是:" << p->next->data << endl;
else
cout << "该元素没有直接后继。" << endl;
break;
}
p=p->next;
}
if(p==NULL)
cout << "该元素不存在。" << endl;
}
int Listinsert(Linklist L,int i,int e)//在第i个位置插入元素e
{
int j;
Lnode *p,*s;
p=L; j=0;
while(p && j<i-1)
{
p=p->next;
++j;
}
if(!p || j>i-1)
return ERROR;
s=(Linklist)malloc(sizeof(Lnode));
if(s==NULL)
cout << "申请内存空间失败。" << endl;
s->data=e;
s->next=p->next;
p->next=s;
cout << "插入的元素是:" << e << endl;
return OK;
}
int Listdelete(Linklist L,int i)//删除第i个数据元素并用e返回其值.
{
int j;
Lnode *p,*q;
p=L;j=0;
while(p->next && j<i-1)
{
p=p->next;
++j;
}
if(!(p->next) || j>i-1)
{
cout << "该位序不存在。" << endl;
return ERROR;
}
q=p->next;
p->next=q->next;
cout << "删除的元素是:" << q->data << endl;
free(q);
return OK;
}
int ListTraverse(Linklist L)//输出all元素.
{
Linklist p;
p=L->next;
if(p==NULL)
{
cout << "该链表中没有元素。" << endl;
return OK;
}
cout << "链表元素如下:" << endl;
while(p)
{
cout << p->data << endl;
p=p->next;
}
return OK;
}
void Tips()
{
cout << "可执行操作有:" << endl;
cout << "+-------------------------------------------------------+" << endl;
cout << "|************** 1.初始化或重置链表 ***************|" << endl;
cout << "|************** 2.销毁链表 ***************|" << endl;
cout << "|************** 3.所指位序的元素值 ***************|" << endl;
cout << "|************** 4.请输入元素,求直接前驱 ***************|" << endl;
cout << "|************** 5.请输入元素,求直接后继 ***************|" << endl;
cout << "|************** 6.在第i个位置插入元素 ***************|" << endl;
cout << "|************** 7.删除第i个元素 ***************|" << endl;
cout << "|************** 8.输出所输入的链表元素 ***************|" << endl;
cout << "|************** 9.初始化并输入链表元素 ***************|" << endl;
cout << "|************** 10.退出 ***************|" << endl;
cout << "+-------------------------------------------------------+" << endl;
}
int main()
{
Linklist L; //L是指针
int i,n2,n1,n4,n5,m1,m2,m3,m4;
int just=0;
do
{
system("cls"); //清屏
Tips();
cout << "请输入你的选择:"; //输入值赋值i
cin >> i;
switch(i)
{
case 1:{
InitList(&L);
cout << "成功初始化一个空的链表!" << endl;
just=1;
break; //初始化链表
}
case 2:{
DestroyList(L); //删除链表
just=0;
break;
}
case 3:{
if(just)
{
cout << "请输入你所要查找的元素:";
cin >> n4;
LocateElem(L,&n4); //节点查询
}
else
cout << "链表不存在。" << endl;
break;
}
case 4:{
if(just)
{
cout << "请输入元素:";
cin >> m3;
PriorElem(L,m3); //前驱节点
}
else
cout << "链表不存在。" << endl;
break;
}
case 5:{
if(just)
{
cout << "请输入元素:";
cin >> m4;
NextElem(L,m4);
} //后驱节点
else
cout << "链表不存在。" << endl;
break;
}
case 6:{
if(just)
{
cout << "请输入插入元素:" ;
cin >> m1;
cout << "请输入插入元素的位置:" << endl;
cin >> m2;
Listinsert(L,m2,m1);
}
else //插入节点
cout << "链表不存在。" << endl;
break;
}
case 7:{
if(just)
{
cout << "请输入删除元素的位置:" << endl;
cin >> n1;
Listdelete(L,n1);
} //删除节点
else
cout << "链表不存在。" << endl;
break;
}
case 8:{
if(just)
ListTraverse(L);
else //遍历
cout << "链表不存在。" << endl;
break;
}
case 9:{
InitList(&L); //申请空间
cout << "请输入链表长度:";
cin >> n5; //初始化并输入链表元素
Creatlist(L,n5); //输入
just=1;
break;
}
case 10:{
cout << "操作结束!" << endl;
exit(0);
break;
}
case 11:{
cout << "操作结束!" << endl;
exit(0);
}
default:
{
cout << "没有该选项,请重新选择。" << endl;
}
}
system("pause");
} while(1);
return 0;
}
更多推荐
所有评论(0)