链表的基本操作

设计程序实现以下功能:
1.创建链表;
2.添加节点(添加至头部、添加至尾部);
3.插入节点到中间位置(一次循环);
4.删除指定位置的元素;
5.查询某个值是否在链表中,如果在输出最后出现的位置。

#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(struct student)
struct student
{
 long num;
 float score;
 struct student *next;
};
int n=0;
void println(struct student *f)
{
 struct student *s=f;
 while(s)
 {
  printf("%ld,%5.2f\n",s->num,s->score);
  s=s->next;
 }
}
struct student *creat(void)
{
 n=0;
 struct student *head,*p1,*p2; 
 printf("请输入两个数据以创建节点,输入0结束\n");
 head=p1=p2=(struct student*)malloc(LEN);
 scanf("%ld%f",&p1->num,&p1->score);
 while(1)
 {
  n++;
  p1=(struct student*)malloc(LEN);
  scanf("%ld",&p1->num);
  if(p1->num==0)
   break; 
  scanf("%f",&p1->score);
  p2->next=p1;
  p2=p1;  
 }
 p2->next=NULL;
 println(head);
 return head;
}
//头增尾增两次 ,两个节点 
struct student* add(struct student *f)
{
 struct student *p1,*p2,*p;
 p1=(struct student*)malloc(LEN);
 p2=(struct student*)malloc(LEN);
 printf("请输入要插入的两个节点数据\n");
 scanf("%ld%f",&p1->num,&p1->score);
 scanf("%ld%f",&p2->num,&p2->score);
 p1->next=f;
 f=p1;
 p=f;
 while(p->next)
 {  
  p=p->next;
 }
 n++;
 p->next=p2;
 p2->next=NULL; 
 println(f);
 return f;
}
//插入中间 
struct student * insert(struct student *s)
{
 struct student *p1=s,*p2=s,*p,*p3=s;
 printf("请输入要插入的节点数据\n");
 p=(struct student*)malloc(LEN); 
 scanf("%ld%f",&p->num,&p->score);
 if(p2->next->next!=NULL)
 {
  while(p2->next)
  {
    p3=p1;
       p1=p1->next;
       p2=p2->next->next;
  }
  p->next=p1->next;
  p1->next=p;
 }
 else
 if(p2->next!=NULL) 
 {
   while(p2)
        {
         p3=p1;
      p1=p1->next;
   p2=p2->next->next;  
     } 
     p3->next=p;
     p->next=p1;
 }  
   // p1->next=p;
 n++;
 println(s);
 return s;
}
//删除指定,free 
struct student* del(struct student *s)
{
 printf("请输入要删除的节点的数据\n");
 struct student *p1,*p2,*p;
 p=(struct student*)malloc(LEN); 
 scanf("%ld%f",&p->num,&p->score);
 p1=s;
 while(p1)
 {
  if(p1->num==p->num&&p1->score==p->score)
  {
   if(p1==s)
   {
    s=s->next;
    p2=s;
    p1=s;
   }
   else
   {
    p2->next=p1->next;
       p1=p2->next;
   }
      n--;   
  } 
  else   
  {
   p2=p1;
   p1=p1->next;
  }  
 }
 println(s);
 return s;
}
//找最后一个出现的值 
void search(struct student *s)
{
 struct student *p1,*p;
 int i=0,f=0;
 p=(struct student *)malloc(LEN); 
 p1=s;
 printf("请输入要找的值\n");
 scanf("%ld%f",&p->num,&p->score);
 while(p1)
 {
  if(p1->num==p->num&&p->score==p1->score)
  {
   f=i;
  }
  p1=p1->next;   
  i++;
 } 
 printf("查找的最后一个位置是:%d\n",f+1); 
}
//用一个menu创建一个列表包含五个函数 
int main()
{
 struct student *pt;
 int menu;
 printf("请输入1(创建),2(增加),3(插入),4(删除),5(查找)\n");
 while(scanf("%d",&menu))
 {
  if(!n&&menu!=1)
  {
   printf("请重新输入,链表为空\n");
   continue;
  }
  switch(menu)
  {
   case 1:pt=creat();break;
   case 2:pt=add(pt);break;
   case 3:pt=insert(pt);break;
   case 4:pt=del(pt);break;
   case 5:search(pt);break;
   default:printf("请重新输入\n");continue;
  }
  printf("请输入1(创建),2(增加),3(插入),4(删除),5(查找)\n");
  } 
 return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值