|
#include <stdio.h> |
|
| 10分 |
循环逻辑不对,第一次循环结束后p为空了,你访问它的所指成员是有问题的~
|
|
for循环纯粹多余,通过单项链表的指针迭代就能控制循环~
|
|
| 89分 |
修改如下:
#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct student)
struct student //定义学生链表结点类型
{
long ID;//学号
char name[12];//姓名
char sex[3];//性别
int age;//年龄
struct student *next;
};
int n;
/************************
函数功能:创建队列式链表
函数参数:无
函数返回值:头指针head
*************************/
struct student *create()
{
struct student *head, *p, *last;
int i;
head = (struct student*)malloc(LEN);//创建头结点
//printf("请依次输入每一个学生的学号、姓名、性别、年龄:\n");
//scanf_s("%d", &head->ID);//输入学号
//getchar();
//gets_s(head->name, 12);//输入姓名
//gets_s(head->sex, 3);//输入性别
//scanf_s("%d", &head->age);//输入年龄
last = head;//末结点指针last初始化
for (i = 0; i < n; i++)
{
p = (struct student *)malloc(LEN);//创建新结点
printf("请依次输入学生%2d的学号、姓名、性别、年龄:\n", i);
scanf_s("%d", &p->ID);//输入学号
getchar();
gets_s(p->name, 12);//输入姓名
gets_s(p->sex, 3);//输入性别
scanf_s("%d", &p->age);//输入年龄
last->next = p;//插入链尾
last = last->next;//last指针后移至末结点
}
last->next = NULL;//链表终止延伸
return head;//返回头指针
}
/******************************
函数功能:打印学生链表中的数据
函数参数:头指针head
函数返回值:无
*******************************/
void printlist(struct student *head)
{
struct student *p;
//p = head;//指向头结点
p = head->next; //指向第一个节点
printf("学生数据为:\n");
while (p != NULL)
{
printf("%ld %s %s %d\n", p->ID, p->name, p->sex, p->age);//输出当前结点包含的信息
p = p->next;//指向下一个结点
}
}
/**************************************************
函数功能:删除含有年龄等于输入年龄的结点
函数参数:头指针head;整形变量key,储存输入的年龄
函数返回值:头指针head
**************************************************/
struct student *del(struct student*head)
{
struct student *p, *pre;
int i, key;
//pre = p = head;
pre = head;
p = head->next;
if (NULL == p)
{
printf("空链表无法删除\n");
return head;
}
printf("请输入要删除的年龄:");
scanf_s("%d", &key);
//for (i = 0; i < n; i++)
while(p)
{
while (key != p->age && p->next != NULL)
{
pre = p;
p = p->next;
}
if (p->age == key)
{
/* 既然是带了头节点,就不需要这样操作了
if (p == head)
head = head->next;
else
pre->next = p->next;
*/
pre->next = p->next; //只用这一句就行
free(p);
p = pre->next;
}
else
{
printf("不存在年龄为%d的学生", key);
break;
}
}
return head;//返回节点删除以后的链表的头指针
}
int main()
{
struct student *head;
printf("请输入学生数:\n");
scanf_s("%d", &n);
head = create();
printlist(head);
head = del(head);
printlist(head);
printf("\nmission has been completed!\n");
getchar();
getchar();
return 0;
}
|
|
运行:
|
|
| 1分 |
p指针为空了
|
|
多谢大神,终于知道错在哪里啦!问题已解决 |
|
|
嗯呐!是的!现在我明白了!谢谢啦! |
|