设计程序实现以下功能:
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;
}