链表的基本操作(C语言实现)
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
typedef int Elemtype;
typedef int Status;
typedef struct LNode{
Elemtype data;
struct LNode *next;
}LNode,*Linklist;
Status Initlist_L(Linklist &L){ //初始化链表
L=(Linklist)malloc(sizeof(LNode));
L->next=0;
printf("初始化成功\n");
return OK;
}
Status Emptylist_L(Linklist L){ //判断链表是否为空
if(L->next ==NULL){
printf("链表为空\n");
return OK;
}
else
{
printf("链表不为空\n");
return ERROR;
}
}
Status Destroylisy_L(Linklist &L){ //销毁链表
Linklist p;
while(L){
p=L;
L=L->next;
free(p);
}
}
Status Clearlist_L(Linklist &L){ //清空链表
Linklist p,q;
p=L->next;
while(p){
q=p->next;
free(p);
p=q;
}
L->next==NULL;
printf("清空成功\n");
return OK;
}
Status Lengthlist_L(Linklist L){ //求链表长度
Linklist p;
p=L->next;
int i=0;
while(p){
i++;
p=p->next;
}
return i;
}
Status GetElem_L(Linklist L,int i,Elemtype &e){ //取值
LNode *p;
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;
}
LNode *LocateElem1_L(Linklist L,Elemtype e){ //查找 返回L中值e的地址
LNode *p;
p=L->next;
while(p&&p->data!=e)
p=p->next;
return p;
}
Status LocateElem2_L(Linklist L,Elemtype e){ //查找 返回L中e的位置序号
Linklist p;
p=L->next;
int j=1;
while(p&&p->data!=e){
p=p->next;
++j;
}
if(p)
return j;
else
return 0;
}
Status Insertlist_L(Linklist &L,int i,Elemtype e){ //插入
Linklist p,s;
p=L;
int j=0;
while(p&&j<i-1){
p=p->next;
j++;
}
if(!p||j>i-1)
return ERROR;
s=(Linklist)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
void display(Linklist L){ //显示
Linklist p;
p=L->next;
while(p){
printf("%d\n",p->data);
p=p->next;
}
}
Status Deletelist_L(Linklist &L,int i,Elemtype &e){ //删除
Linklist p,q;
p=L;
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;
free(q);
return OK;
}
int main(){
Linklist L;
Initlist_L(L); //初始化
Emptylist_L(L); //判断是否为空
printf("请输入您要输入数据的个数\n");
int n;
scanf("%d",&n);
int i,e;
for(i=1;i<=n;i++){ //插入
scanf("%d",&e);
Insertlist_L(L,i,e);
}
display(L);
printf("删除第几个数据\n");
scanf("%d",&i);
Deletelist_L(L,i,e); //删除
display(L);
printf("查找第几个数据的值\n");
scanf("%d",&i);
int e2;
GetElem_L(L,i,e2); //取第i个数的值
printf("第%d个的值为%d\n",i,e2);
LNode *e1;
int c;
printf("请输入您要查找的数据\n");
scanf("%d",&c);
e1=LocateElem1_L(L,c); //查找 返回L中值e的地址
printf("地址为%p\n",&e1->data);
printf("请输入您要查找的数据\n"); //查找 返回L中值e的位置序号
scanf("%d",&c);
i=LocateElem2_L(L,c);
printf("是第%d个数据\n",i);
int a;
a=Lengthlist_L(L); //求链表长度
printf("链表长为%d\n",a);
Clearlist_L(L); //清空
Destroylisy_L(L); //销毁
}