您的位置:首页 > 其它

单链表的基本操作

2007-04-25 14:50 471 查看
#include<stdio.h>
#include<malloc.h>
typedef struct Lnode{
int data;
struct Lnode *next;
}Lnode,*LinkList;//定义单链表

void Create_LinkList(LinkList &L)
{
L=(LinkList)malloc(sizeof(Lnode));
L->next =NULL;
int j=0;//记录单链表中元素个数
printf("输入链表中的五个元素:");
/* for(int i=1;i<=5;i++)
{
LinkList p=(LinkList)malloc(sizeof

(Lnode));
p->next=L->next;
L->next =p;
scanf("%d",&p->data);
j++;//记录单链表的长度
}//(逆序实现)
*/
LinkList q=L;
for(int i=1;i<=5;i++)
{
LinkList p=(LinkList)malloc (sizeof

(Lnode));
q->next=p;
p->next=NULL;
q=q->next ;
scanf("%d",&p->data);
j++;//记录单链表的长度
}//(正序实现)

}//初始化单链表

void Printf_LinkList(LinkList L)
{
LinkList p;
p=L->next;
while(p)
{
printf("%d ",p->data );
p=p->next;
}
}//输出单链表

void LinkList_Empty(LinkList L)
{
if(L->next) printf("链表非空/n");
else printf("链表为空表/n");
}//判断单链表是不是空表

void Clear_LinkList(LinkList L)
{
L->next =NULL;
}//将单链表置空

void GetElem_LinkList(LinkList L,int i,int &e)
{
LinkList p=L->next;
int j=1;//计数器
while(p&&j<i)
{
p=p->next;
j++;
}
if(!p||j>i) printf("error/n");//第i个元素不存在
e=p->data;//取第i个元素
}//取单链表中第i个元素

void Delete_LinkList(LinkList &L,int i,int &e)
{
LinkList p=L;
int j=0;//计数器
while (p->next&&j<i-1)
{
p=p->next;
j++;
}
if(!p->next||j>i-1) printf("error1/n");
LinkList q=p->next;
p->next=q->next;
e=q->data;//存储删除的元素
free(q);//释放删除的空间
}//删除单链表中第i个元素

void Insert_LinkList(LinkList &L,int i,int e)
{
LinkList p=L;
int j=0;
while(p&&j<i-1)
{
p=p->next;
j++;
}
if(!p||j>i-1) printf("error2/n");
LinkList s=(LinkList)malloc(sizeof(Lnode));
s->data=e;
s->next =p->next ;
p->next =s;
}//在单链表的第i个元素前插入e

int Length_LinkList(LinkList L)
{
int j=0;//用来记录单链表中元素个数
LinkList p=L;
while (p->next)
{
p=p->next;
j++;
}
return j;
}//求单链表中元素个数

void PriorElem(LinkList L,int cur_e,int &pre_e)
{
bool flag=0;
LinkList p=L->next;
if(!p) printf("链表为空表/n");
else
{
for(p=L->next;p->next;p=p->next)
{
if(p->next->data==cur_e)
{
pre_e=p->data;
flag=1;
}
}
if(flag==0) printf("无前驱/n");

}

}//求前驱

void NextElem(LinkList L,int cur_e,int &next_e)
{
bool flag=0;
LinkList p=L->next;
if(!p) printf("链表为空表1/n");
else
{
for(p=L->next;p->next;p=p->next)
{
if(p->data==cur_e)
{
next_e=p->next-

>data;
flag=1;
}
}
if(flag==0) printf("无后继/n");
}
}//求后继

int Locate_LinkList(LinkList L,int e)
{
LinkList p=L->next;
int j=1;
while(p->data!=e&&p->next)
{
p=p->next;
j++;
}

if(p->data==e) return j;
else
{
printf("无当前元素/n");
return 0;
}
if(!p)
{
printf("无当前元素/n");
return 0;
}

}//定位

main()
{
int a;//用a来存储单链表中的第三个元素
int b;//用b来存储删除单链表中的第三个元素
int c;//用来存储单链表长度
int d;//用来存储前驱
int f;//用来存储后继
int g;//用来存储所找元素的位置
LinkList La;//创建单链表La
Create_LinkList(La);//初始化单链表
LinkList_Empty(La);//判断表是不是空表
GetElem_LinkList(La,3,a);//取单链表中第三个元素并用a存储
Delete_LinkList(La,3,b);//删除单链表中第三个元素并用b存储
Insert_LinkList(La,4,5);//在第4个元素前插入5
c=Length_LinkList(La);//求单链表长度
PriorElem(La,5,d);//求5的前驱
NextElem(La,5,f);//求5的后继
g=Locate_LinkList(La,5);//定位操作
printf("g=%d",g);
printf("f=%d",f);
printf("d=%d",d);

printf("a=%d/n",a);
printf("b=%d/n",b);

Printf_LinkList(La);//输出单链表
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: