一,详细代码
#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文件,即可实现。
在之后会发布多文件形式的链表,并且会发布队列和栈的系列代码,敬请期待!