单链表的相关操作
编译环境:Microsoft Visual C++2010学习版
参考教材:数据结构:C语言版/严蔚敏,李冬梅,吴伟民编
备注:本文留作作者自用,如有错误敬请指出
#include<iostream>
#include<cstdlib>
using namespace std;
#define MAX 10
#define Elemtype int
#define Status int
int j;
typedef struct LNode{
Elemtype data;
struct LNode *next;
}LNode,*LinkList;
LinkList p,s,q,r;
bool InitList(LinkList &L){//初始化
L=new LNode;
L->next=NULL;
return true;
}
void DestroyList(LinkList &L){//销毁
q=L;
while(q){
p=q;
q=q->next;
delete p;}
}
void ClearList(LinkList &L){//清空
q=L->next;
while(q){
p=q;
q=q->next;
delete p;}
L->next=NULL;
}
int ListLength(LinkList L){//求表长
p=L->next;
j=0;
while(p){
++j;
p=p->next;}
return j;
}
bool ListEmpty(LinkList L){//判断表是否为空
if(!(L->next)) return true;
else return false;
}
bool GetElem(LinkList L,int i,Elemtype &e){//取值
p=L->next;j=1;
while(p&&j<i){
p=p->next;
++j;
}
if(!p||j>i) return false;
e=p->data;
return true;
}
int LocateElem(LinkList L,Elemtype e){//查找
p=L->next;j=1;
while(p&&((p->data)!=e)){
p=p->next;
j++;}
if(j<=MAX) return j;
else return 0;
}
Status ListInsert(LinkList &L,int i,Elemtype e){//插入
p=L;j=0;
while(p&&j<i-1){
p=p->next;++j;}
if(!p||j>i-1) return 0;
s=new LNode;
s->data=e;
s->next=p->next;
p->next=s;
return 1;
}
Status ListDelete(LinkList &L,int i){//删除
p=L;j=0;
while(p->next&&j<i-1){
p=p->next;
++j;}
if(!(p->next)||j>i-1) return 0;
q=p->next;
p->next=q->next;
delete q;
return 1;
}
void CreateList_H(LinkList &L,int n){//前插法创建单链表
for(int i=0;i<n;++i){
p=new LNode;
cin>>p->data;
p->next=L->next;
L->next=p;}
}
void CreateList_R(LinkList &L,int n){//后插法创建单链表
r=L;
for(int i=0;i<n;++i){
p=new LNode;
cin>>p->data;
p->next=NULL;
r->next=p;
r=p;}
}
int main(){
LinkList L;
Elemtype e;
cout<<"---初始化--------"<<endl;
InitList(L);
cout<<"---前插法创建单链表--------"<<endl;
cout<<"请输入"<<MAX<<"个整数:"<<endl;
CreateList_H(L,MAX);
cout<<"---求线性表的长度--------"<<endl;
cout<<"表长:"<<ListLength(L)<<endl;
cout<<"---判断表是否为空--------"<<endl;
cout<<"表是否为空:"<<(ListEmpty(L)?"是":"否")<<endl;
cout<<"---取值--------"<<endl;
GetElem(L,4,e);
cout<<"表中第4个元素是:"<<e<<endl;
cout<<"---查找--------"<<endl;
int loc=LocateElem(L,6);
if(loc) cout<<"表中第 "<<loc<<" 个元素是6"<<endl;
else cout<<"链表中没有元素6"<<endl;
cout<<"---插入--------"<<endl;
ListInsert(L,6,66);
cout<<"表长:"<<ListLength(L)<<endl;
cout<<"---删除--------"<<endl;
ListDelete(L,9);
cout<<"表长:"<<ListLength(L)<<endl;
cout<<"---清空--------"<<endl;
ClearList(L);
cout<<"表长:"<<ListLength(L)<<endl;
cout<<"---后插法创建单链表--------"<<endl;
cout<<"请输入"<<MAX<<"个整数:"<<endl;
CreateList_R(L,MAX);
cout<<"---取值--------"<<endl;
GetElem(L,4,e);
cout<<"表中第4个元素是:"<<e<<endl;
cout<<"---查找--------"<<endl;
loc=LocateElem(L,6);
if(loc) cout<<"表中第 "<<loc<<" 个元素是6"<<endl;
else cout<<"链表中没有元素6"<<endl;
cout<<"---销毁--------"<<endl;
DestroyList(L);
system("pause");
return 0;
}