在设计动态链表用于存放学生的姓名,学号和三门课程的成绩,要求设计del函数实现对前六个学生中成绩平均分最高与最低的学生数据删除。
在设计过程中遇到了下列问题
1.动态链表的输出多了一段地址
2.结构体指针在使用时发生了冲突。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define _CRT_SECURE_NO_WARNINGS
#define len sizeof(struct date)
int n;//节点数量
struct date//建立结构体
{
char name;//姓名
int id;//学号
int score1;//成绩1
int score2;//成绩2
int score3;//成绩3
struct date *next;//指向下一个结构体的指针
};
struct date* creat(void)//创建动态链表并返回头指针
{
struct date* head, * p1, * end;
n = 0;
p1 = end = (struct date*)malloc(len);
printf("请输入学生的姓名,学号,以及三门课程的成绩:\n");
scanf("%c,%d %d %d %d", &p1->name,&p1->id, &p1->score1, &p1->score2, &p1->score3);
head = NULL;
while (p1->name!=32)
{
n = n + 1;
if (n == 1)
head = p1;
else
end->next= p1;
end = p1;
p1 = (struct date*)malloc(len);
scanf("%c,%d %d %d %d", &p1->name, &p1->id, &p1->score1, &p1->score2, &p1->score3);
}
end->next = NULL;//尾指针
return(head);
}
struct date* creat(void);
void del(struct date* pt);
int main()
{
int i;
struct date* pt,;
pt = creat();//让pt成为头指针
printf("若不执行任何操作请输0\n");
printf("若要新增数据请输1;\n");
printf("若要删除前面6个学生中平均分最高和最低的学生的数据请输2\n");
scanf("%d", &i);
switch (i)
{
case 0:break;
//case 1:insert(pt, n); break;
case 2:del(pt); break;
}
do{
printf("%c,%d %d %d %d\n",(pt->name),(pt->id),(pt->score1),(pt->score2),(pt->score3));//输出链表
pt=pt->next;
} while (pt ->next!= NULL);
return 0;
}
void del(struct date* pt)//找出前6组数据中的最高,最低平均分并删去
{
struct date* h1 = pt,*h2=pt,*in=pt,*h3=pt;
int averge[6] = { 0 }, x = 0, i = 0, z = 0;
int y, o=0, p;
float min,max;
min = (float)(averge[0]);
max = (float)(averge[0]);
for (y= 0; y < 6; y++)
{
averge[y] = (float)((h2->score1 + h2->score2 + h2->score3) / 3);//用一个数组记录每个人的平均分
h2 = h2->next;
}
free(h2);
for (y = 0; y < 6; y++)
{
if ((float)averge[y] < min)
{
min = (float)averge[y];
o= y;//记下最小值的坐标
}
if ((float)averge[y] > max)
{
max = (float)averge[y];
p = y;
}
}
while (i < o && h1 != NULL)
{
in = h1;
h1 = h1->next;//使指针移动到要找到的坐标
i++;
}
if (h1 != NULL)
{
in->next = h1->next;//更改最小值坐标的前一个结构体的指针使其跳过该坐标
free(h1);
}
while (z < p && h3 != NULL)
{
in = h3;
h3= h3->next;
i++;
}
if (h3 != NULL)
{
in->next = h3->next;
free(h3);
}
}
运行结果及详细报错内容
思路:对于del函数,先用数组储存每个同学的平均分,然后再找出最高分与最低分的地址。对其前一个结构体的指针进行修改。