单链表的基本操作

 #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;
}

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值