单链表的基本操作
一:通常的定义
typedef struct{
char a[8];
int score;
} ElemType;
typedef struct Lnode
{
ElemType data;
struct Lnode *next;
} Lnode,*Linklist;
二:基本操作
1 判断链表是否非空
int ListEmpty (Linklist L)
{
if(L->next)
return 0;
else return 1;
}
2 销毁单链表
Ststus DestroyList (Linklist &L)
{
Lnode *p;
while(L){
p=L;
L=L->next;
delete p;
}
}
3 清空单链表
Ststus ClearList (Linklist &L)
{
Lnode *p,*q;
p=p->next;
while(p){
q=p->next;
delete p;
p=q;
}
L->next=NULL;
return OK;
}
4 求链表的表长
int ListLength_L(Linklist L)
{
Linklist p;
p=L->next;
int i=0;
while(p)
{
i++;
p=p->next;
}
return i;
}
5 获取某个元素的内容 通过变量e返回值
Status GetElem_L(Linklist L,int i,Elemtype &e)
{
Linklist p;
p=L->next;j=1;
while(p&&j<i)
{
p=p->next;
j++;
}
if(!p||j>i) return ERROR;
e=p->data;
return OK;
}
6 按值查找
int LocateElem_L(Linklist L,Elemtype e){
Linklist p;
int j=1;
p=L->next;
while(p&&p->data!=e)
{
p=p->next;
j++;
}
if(p) return j;
else return 0;
}
7 插入操作(在第i个元素前插入数据元素e)
Status ListInsert_L(Linklist &L,int i,Elemtype e)
{
Linklist p=L,s;
int j=0;
while(p&&j<i-1){
p=p->next;
j++;
}
if(!p||j>i-1) return ERROR;
s=new Lnode;
s->data=e;
s->next=p->next;
p->next=s;
}
8 删除第i个元素
Status ListDelete_L(Linklist &L,int i,ElemType &e)
{
Linklist p=L,q;
int j=0;
while(p->next&&j<i-1)
{
p=p->next;
j++;
}
if(!(p->next)||j>i-1) return ERROR;
q=p->next;
p->next=q->next;
e=q->data;
delete q;
return OK;
}
9 单链表的建立
1>头插法(如输入12345 ,所建立的链表 54321)
void Createlist_H(Linklist &L,int n)
{
Linklist p;
L=new Lnode;
int n,t;
L->next=NULL;
while(n--)
{
p=new Lnode;
scanf("%d",&t);
p->data=t;
p->next=L->next;
L->next=p;
}
}
2>尾插法 如输入12345 ,所建立的链表 12345,要用到尾指针)
void Createlist_H(Linklist &L,int n)
{
Linklist R;
L=new Lnode;
L->next=NULL;
R=L;
while(n--){
int t;
scanf("%d",&t);
Linklist p;
p=new Lnode;
p->data=t;
p->next=NULL;
R->next=p;
R=p;
}
}