单链表的基本操作

#include<stdio.h>

#include<stdlib.h>

 

typedef int Elemtype;

typedef int Status;

 

typedef struct node //定义存储节点

{

 Elemtype data; //数据域

 struct node *next;//结构体指针

} node,*linklist; //结构体变量,结构体名称

 

linklist creat(int n)//创建单链表,采用头插法建表

{

 linklist head,p; //定义头指针head指针,p指针指向当前新生成的结点

 int x,i;

 head=(node *)malloc(sizeof(node));//生成头结点

 head->next=NULL;

 printf("输入结点值:\n");

 for(i=n;i>0;i--) //for 循环用于生成第一个节点并读入数据

 {

  scanf("%d",&x);

  p=(node *)malloc(sizeof(node));

  p->data=x;//读入第一个节点的数据

  p->next=head->next;//把第一个节点始终插在头结点的后面

  head->next=p;//循环以便于生成第二个节点

 }

    return head;//返回头指针

}

 

void output(linklist head)//输出链表

{

 linklist p;

 p=head->next;

 while(p)

 {

  printf("%3d",p->data);

  p=p->next;

 }

 printf("\n");

}

 

Status insert(linklist &l,int i,Elemtype e) //插入操作

{

 int j=0;

    linklist p=l,s;

 while(j<i-1 && p)

 {

  p=p->next;

  ++j;

 }

 if(!p||j>i-1)

     printf("插入失败,请输入合理的插入位置\n");

 else

 {

  s=(node *)malloc(sizeof(node));

  s->data=e;

  s->next=p->next;

  p->next=s;

 }

 return 1;

}

 

 

Status delect(linklist &l,int i,Elemtype &e) //删除操作

{

 int j=0;

    linklist p=l,q;

    while(j<i-1 && p)

    {

     p=p->next;

  ++j;

    }

    if(!p->next || j>i-1)

  printf("删除失败,请输入合理的删除位置\n");

    else

    {

     q=p->next;

     p->next=q->next;

     e=q->data;

     free(q);

    }

    return 1;

}

 

Status GetElem(linklist l,int i,Elemtype &e) //查找操作

 {

 linklist p=l->next;

 int j=1;

 while(p&&j<i)

 { 

  p=p->next;

  ++j;

 }

 if(!p||j>i)

  printf("查找失败,请输入合理的查找位置\n");

 else

 {

  e=p->data;

     printf("查找成功,要查找的元素为%d\n",e);

 }  

    return 1;

 }

 

int main()

{

 linklist la;

 int n;

 int i;

 Elemtype e;

 char cmd;

 printf("输入链表元素的个数:");

 scanf("%d",&n);

 la=creat(n);

 printf("输出链表:\n");

 output(la);

 

    do

 {

  printf("g,G...查找\n");

  printf("i,I...插入\n");

  printf("d,D...删除\n");

  printf("q,Q...退出\n");

  do

  {

   scanf("%c",&cmd);

  }

  while((cmd!='g')&&(cmd!='G')&&(cmd!='d')&&(cmd!='D')&&(cmd!='q')&&(cmd!='Q')&&(cmd!='i')&&(cmd!='I'));

  switch(cmd)

  {

  case'g':

  case'G':

   printf("请输入要查找元素的位置:\n");

   scanf("%d",&i);

   GetElem(la,i,e);

   break;

  case'i':

  case'I':

   printf("请输入要插入的数据:");

   scanf("%d",&e);

   printf("请输入要插入的位置:");

   scanf("%d",&i);

   insert(la,i,e);

   output(la);

   break;

  case'd':

  case'D':

   printf("请输入要删除的位置:");

   scanf("%d",&i);

   delect(la,i,e);

   output(la);

   break;

  }

 }

 while((cmd!='q')&&(cmd!='Q'));

}

067d2109d48341cf90c90552ff4c88fb.jpg

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值