问题描述

某班学生的信息存放在一个线性单链表中,但每学期都有学生因故退学。

现要求根据退学学生的学号,将其信息从链表中删除。

假设学生的数据只保存姓名、学号、性别,并采用结构体类型描述。

 

输入说明

输入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;
}

 

posted on 2020-03-20 14:02  allons10  阅读(575)  评论(0)    收藏  举报