本题为XD数据结构上机链表单元第一道练习,主要是让大家熟悉下链表和如何用链表来存储相应数据,并使用指针进行查找链表中的相应数据,进行删除运算等。由于在进行链表的空间分配时没考虑全面,导致会出现越界等现象,已经在代码中易错部分添加注释,如有其他建议,欢迎和我进一步探讨。
问题描述
某班学生的信息存放在一个线性单链表中,但每学期都有学生因故退学。现要求根据退学学生的学号,将其信息从链表中删除。假设学生的数据只保存姓名、学号、性别,并采用结构体类型描述。
输入说明
输入n个学生数据(1<=n<=10)。每行一个学生信息,包括:姓名(不超过20个字符的字符串)、学号(整形)、性别(字符),以空格分隔。学生数据以#结束,并在下一行输入退学学生的学号。
输出说明
若链表中有退学学生,输出删除该学生后的学生数据;如果链表中没有该学生,则输出错误信息No。
输入样例
例1:
LiDong 1001 M
ZhaoJian 1002 M
ChenKai 1003 M
LiXia 1004 F
WangHong 1005 F
QianLi 1006 F
ZhouQiang 1007 M
#
1003
例2:
LiDong 1001 M
ZhaoJian 1002 M
ChenKai 1003 M
LiXia 1004 F
WangHong 1005 F
QianLi 1006 F
ZhouQiang 1007 M
#
1008
输出样例
例1:
LiDong 1001 M
ZhaoJian 1002 M
LiXia 1004 F
WangHong 1005 F
QianLi 1006 F
ZhouQiang 1007 M
例2:
No
#include<stdio.h>
#include<string.h>
#include<malloc.h>
typedef struct student {
char name[20];
int number;
char gender;
}student;
typedef struct LinkList {
student* data;
LinkList* next;
}LinkList;
LinkList* creatList() {
char ch[20];
LinkList* head, * r, * s;
head=(LinkList*)malloc(sizeof(LinkList)); //生成头节点head
r = head; //尾指针指向头结点
scanf("%s",ch);
while (ch[0] != '#') { //输入不是#就进入循环
// cout<<"请输入第学生的学号、姓名和性别:\n";
s = (LinkList*)malloc(sizeof(LinkList)); //动态分配空间大小
s->data=(student*)malloc(sizeof(student)); //注意,由于上面仅分配了s的空间,但是并没有分配data的空间,如果直接赋值就会越界
strcpy(s->data->name,ch); //将ch的值赋值给s->data
// cin>>s->data->name>>s->data->gender;
scanf("%d %c",&s->data->number,&s->data->gender);
r->next = s; //尾指针的下一个指向s
r = s; //尾指针的值赋为s
scanf("%s",ch); //读入下一个字符串
}
r->next = NULL;//链表的最后指向一个新地址
return head;
}
int delete_point(LinkList* list, int n)
{
LinkList* p;
LinkList* q;
int flag = 0; //标志,如果没有该学生则输出0
p = list;
q = list->next;
while (true)
{
if(q==NULL){ //如果q指针为空就跳出循环,否则下面会越界
break;
}
if(q->data->number==n){
flag = 1; //如果找到了对应数字就将flag赋为1
p->next = q->next; //将指向p下一个的指针指向q的下一个
free(q); //将q指针的空间释放
break;
}
p=q;
q=q->next;
}
return flag;
}
void output_list(LinkList* point)
{
LinkList* p;
p = point;
// cout << endl << endl << endl;
while ((p = p->next) != NULL) //如果p的下一个不为空就进入循环
{
printf("%s %d %c\n",p->data->name,p->data->number,p->data->gender); //打印输出
}
}
int main()
{
LinkList* head;
// output_list(head);
head = creatList(); //创建一个链表
int num;
scanf("%d", &num);
int flag = delete_point(head, num);
if(flag ==1){ //如果找到了就输出删除后的列表
output_list(head);
}
else{
printf("No"); //没有找到就输出NO
}
return 0;
}