实验项目 3 (结构体和链表)
替换实验项目 1 的 5 个菜单项目,完成要求的功能
菜单第 1 项完成:创建一个仅含头结点的空链表,如果创建成功,输出创建空链表成功,
返回头结点的指针,否则输出创建空链表失败,退出程序运行。
菜单第 2 项完成:依次输入一组整数,以-1 作为结束的标志,创建由这些输入数据所形
成的带头结点的单链表,返回头结点的指针,输出链表的数据信息。若输入:45,45,23,
45,54,25,-1。则生成链表:
菜单第 3 项完成:输入一个整数。将这个数插入在第 2 项建立的链表的链尾,并输出整
个链表中的数据信息。
菜单第 4 项完成:输入一个整数,删除这个数在第 3 项完成后的链表中的所有出现,并
输出删除后链表的数据信息。
菜单第 5 项完成:在第 4 项完成后,求链表中各结点数据的平均值,并输出。
(备注:由于输出链表中的数据要多次使用,可以编一输出函数,多次调用完成输出
)
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node *next;
}Node;
Node *p1();
Node *Creat(Node *head);
void p2(Node *head);
void Put(Node *head);
Node *p3(Node *head);
Node *p4(Node *head);
void p5(Node *head);
int main()
{
printf("1:创建一个空链表\n");
printf("2:输入并输出链表信息\n");
printf("3:插入一个数到链表尾部\n");
printf("4:删除想要删掉的链表元素\n");
printf("5:求链表中数据的平均值\n");
int x;
Node *head,*q,*p;
while(1)
{ printf("请输入1-5之间的数:\n");
scanf("%d",&x);
switch(x)
{
case 1:p1();break;
case 2:p2(head);break;
case 3:q=p3(head);Put(q);break;
case 4:p=p4(head);Put(p);break;
case 5:p5(head);break;
default:
exit(0);
}
}
}
Node *p1()
{
Node *head;
head=(Node *)malloc(sizeof(Node));
if(head==NULL)
{
printf("创建链表失败");
exit(0);
}
else
{
printf("创建链表成功\n");
head->next=NULL;
}
return head;
}
Node *Creat(Node *head)
{
head=p1();
Node *q,*p;
q=head;
int data;
printf("输入链表数据(-1为结束标志)\n");
do{
p=(Node *)malloc(sizeof(Node));
if(p==NULL)
exit(0);
scanf("%d",&data);
p->data=data;
q->next=p;
q=p;
}while(p->data!=-1);
p->next=NULL;
return head;
}
void Put(Node *head)
{
Node *s=head;
while(s!=NULL)
{
if(s!=head&&s->data!=-1)
printf("%d ",s->data);
s=s->next;
}
free(head);
}
void p2(Node *head)
{
Node *p;
p=Creat(head);
Put(p);
printf("\n");
}
Node *p3(Node *head)
{
Node *p,*s,*q;
q=p=Creat(head);
printf("输入想插入到尾部的数:\n");
int x;
scanf("%d",&x);
while(p->next!=NULL)
{
s=p;
p=p->next;
}
s->next=p;
p->data=x;
p->next=NULL;
return q;
}
Node *p4(Node *head)
{
Node *p,*s,*q,*f;
f=q=p=p3(head);
while(f!=NULL)
{
if(f!=q&&f->data!=-1)
printf("%d ",f->data);
f=f->next;
}
printf("\n");
int x;
printf("输入想要删除的链表元素:\n");
scanf("%d",&x);
s=p;
p=p->next;
while(p!=NULL)
{
if(p->data==x)
{
s->next=p->next;
free(p);
p=s->next;
}
else
{
s=p;
p=p->next;
}
}
return q;
}
void p5(Node *head)
{
Node *p,*q,*s;
int n=0,c=0;
float ave;
s=p=q=p4(head);
while(s!=NULL)
{
if(s!=q&&s->data!=-1)
printf("%d ",s->data);
s=s->next;
}
p=p->next;
while(p!=NULL)
{
n=n+p->data;
c++;
p=p->next;
}
ave=(float)n/c;
printf("\n");
printf("平均数为:%.2f\n",ave);
}
1:创建一个空链表
2:输入并输出链表信息
3:插入一个数到链表尾部
4:删除想要删掉的链表元素
5:求链表中数据的平均值
请输入1-5之间的数:
1
创建链表成功
请输入1-5之间的数:
2
创建链表成功
输入链表数据(-1为结束标志)
1
4
5
6
-1
1 4 5 6
请输入1-5之间的数:
3
创建链表成功
输入链表数据(-1为结束标志)
12
5
46
-1
输入想插入到尾部的数:
6
12 5 46 6 请输入1-5之间的数: