问题描述
某班学生的信息存放在一个线性单链表中,但每学期都有学生因故退学。
现要求根据退学学生的学号,将其信息从链表中删除。
假设学生的数据只保存姓名、学号、性别,并采用结构体类型描述。
输入说明
输入n个学生数据(1<=n<=10)。每行一个学生信息,包括:
姓名(不超过20个字符的字符串)、学号(整形)、性别(字符),以空格分隔。
学生数据以 # 结束,并在下一行输入退学学生的学号。
输出说明
若链表中有退学学生,输出删除该学生后的学生数据;
如果链表中没有该学生,则输出错误信息No。
学校布置了一些链表的题,我本打算借助度娘,然鹅,扒来的代码要么有错误,要么我看不懂......于是只好自己从头学起
#include<stdio.h> #include<string.h> #include<malloc.h> typedef struct node { char name[100]; int number; char sex; struct node *next; }list; //建立单链表 list *CreateList() { char name[100] = "\0"; list *head,*end,*p; head=(list*)malloc(sizeof(list));//生成头结点 end=head;//尾指针指向头结点 scanf("%s",name); while(name[0]!='#') { //当输入'#'时结束循环 p= (list *)malloc(sizeof(list));//生成新结点 strcpy(p->name,name); scanf("%d %c",&p->number,&p->sex);//赋值 end->next=p; end=p; fflush(stdin);//清空缓冲区 scanf("%s",name); } end->next = NULL; return head; } list *Locate(list *head,int num) { list *p = head->next; while(p!=NULL) { if(p->number==num)return p; p = p->next; } return NULL;; }//查找 void Delete(list *head,list *t) { list *p = head; while(p->next!=t) p = p->next; p->next = t->next; free(t); }//删除 void Output(list *head) { list *r = head->next; while(r!=NULL) { printf("%s %d %c\n",r->name,r->number,r->sex); r = r->next; } }//输出 int main() { int num; list *L; list *p; L = CreateList(); fflush(stdin); scanf("%d",&num); p=Locate(L,num); if(p == NULL) { printf("No\n"); } else { Delete(L,p); Output(L); } return 0; }
浙公网安备 33010602011771号