一,详细代码
#include<iostream>
#include<stdlib.h>
using namespace std;
#define ok 1
#define error 0
typedef int status;
typedef int elemtype;
//创建链表
typedef struct lnode{
elemtype data;
struct lnode *next;
}lnode,*linklist;
status initlist(linklist &l);
void creatlist_h(linklist &l,int n);
void creatlist_r(linklist &l,int n);
void showlist(linklist l);
status listinsert(linklist &l,int i,elemtype e);
status listdelete(linklist &l,int i);
status getelem(linklist l,int i,elemtype &e);
int listlength(linklist l);
status listsort(linklist &l);
void sortlistinsert(linklist &l,elemtype e);
//初始化
status initlist(linklist &l)
{
l=new lnode;
if(!l) return error;
l->next=null;
return ok;
}
//前插法
void creatlist_h(linklist &l,int n)
{
int i;
lnode *p;
l=new lnode;
l->next=null;
for(i=0;i<n;i++)
{
p=new lnode;
cout<<"第"<<i+1<<"个数=";
cin>>p->data;
p->next=l->next;
l->next=p;
}
}
//尾插法
void creatlist_r(linklist &l,int n)
{
int i;
l=new lnode;
l->next=null;
lnode *p,*r;
r=l;
for(i=0;i<n;i++){
p=new lnode;
p->next=null;
cout<<"第"<<i+1<<"个数=";
cin>>p->data ;
r->next=p;
r=p;
}
}
//输出
void showlist(linklist l)
{
lnode *p=l->next;
while(p)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
//插入
status listinsert(linklist &l,int i,elemtype e)
{
lnode *p=l;
int j=0;
while(p&&j<i-1)
{
p=p->next;
j++;
}
if(!p||j<i-1)
return error;
lnode *s=new lnode;
s->data=e;
s->next=p->next;
p->next=s;
return ok;
}
//删除
status listdelete(linklist &l,int i)
{
lnode *p,*q;
p=l;
int j=0;
while((p->next)&&j<i-1)
{
j++;
p=p->next;
}
if(p->next==null||j>i+1)
return error;
q=p->next;
p->next=q->next;
delete q;
return ok;
}
//取值
status getelem(linklist l,int i,elemtype &e)
{
lnode *p=l->next;
int j=1;
while(p&&j<i)
{
p=p->next;
j++;
}
if((!p)||j>i) return error;
e=p->data;
return ok;
}
//计算长度
int listlength(linklist l)
{
int len=0;
lnode*p;
p=l->next;
while(p!=null)
{
p=p->next;
len++;
}
return len;
}
//冒泡排序
status listsort(linklist &l)
{
int len=listlength(l);
if(len==0) return error;
lnode*p,*q;
elemtype t;
int i,j;
for(i=0;i<len-1;i++){
p=l->next;
q=p->next;
for(j=0;j<len-1;j++)
{
if(p->data<q->data)
{
t=p->data;
p->data=q->data;
q->data=t;
}
p=p->next;
q=q->next;
}
}
return ok;
}
//有序插入
void sortlistinsert(linklist &l,elemtype e)
{
lnode*q=l;
lnode*p=l->next;
while(p!=null&&p->data>e)
{
q=p;
p=p->next;
}
lnode*s=new lnode;
s->data=e;
s->next=p;
q->next=s;
}
int main()
{
linklist l;
elemtype e;
lnode *p;
int choice,n,i;
while(1)
{
cout<<"1,初始化 2,头插法 3,尾插法 4,显示"<<endl;
cout<<"5,插入 6,删除 7,取值" <<endl;
cout<<"8,排序 9,有序插入"<<endl ;
cout<<"选项=";
cin>>choice;
switch(choice)
{
case 1:
if(initlist(l)==ok)
cout<<"链表初始化成功!"<<endl;
else
cout<<"链表初始化错误!"<<endl;
break;
case 2:
//头插法
cout<<"创建个数="<<endl;
cin>>n;
creatlist_h(l,n);
break;
case 3:
cout<<"创建个数="<<endl;
cin>>n;
creatlist_r(l,n);
break;
case 4:
showlist(l);
break;
case 5:
cout<<"插入数据=";
cin>>e;
cout<<"插入位置=";
cin>>i;
if(listinsert(l,i,e)==ok)
cout<<"数据插入成功"<<endl;
else
cout<<"数据插入失败"<<endl;
break;
case 6:
cout<<"删除位置=";
cin>>i;
if(listdelete(l,i)==ok)
cout<<"删除成功!"<<endl;
else
cout<<"删除失败!"<<endl;
break;
case 7:
cout<<"取值位置=";
cin>>i;
if(getelem(l,i,e)==ok)
cout<<"取值="<<e<<endl;
else
cout<<"取值失败!"<<endl;
break;
case 8:
if(listsort(l)==ok)
cout<<"排序成功!"<<endl;
else
cout<<"链表为空!"<<endl;
break;
case 9:
cout<<"插入数据=";
cin>>e;
sortlistinsert(l,e);
break;
case 0:
return 0;
break;
default:
cout<<"选项输入错误"<<endl;
}
system("pause");
system("cls");
}
return 0;
}
二,预告
此代码同样使用了菜单的实现形式,可以把此菜单改写成多文件形式,通过划分不同的头文件和cpp文件,即可实现。
在之后会发布多文件形式的链表,并且会发布队列和栈的系列代码,敬请期待!
发表评论