cxk521aoligei
2021-09-11 15:08
采纳率: 100%
浏览 43

c语言链表的删除!!

想写一个学生成绩管理系统,写了几个函数了;到链表节点的删除函数是,无论想删那个学号,都删的是第一个,感觉程序没问题啊,希望帮忙给找找错误
代码如下
主函数

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
#define LEN  sizeof(struct Student)
#include"声明.h"
#include"自定义函数.h"
 
int main(void) 
{
    char s[15];
    
    while(1)
    {
        printf("请输入功能编号完成相应功能\n");
        printf("1.输入学生信息并保存\n");
        printf("2.从文件中读取学生信息,并建立链表\n");  
        printf("3.按学号删除学生信息\n"); 
        printf("4.按学号插入学生信息\n"); 
        printf("5.显示当前文件信息\n"); 
        printf("6.查找总成绩最高的学生\n");
        printf("7,寻找指定学号或姓名的学生并修改该学生信息 \n");
        printf("8.查找某个专业、某门课程的成绩小于某个分数的学生\n");
        printf("9.删除某个班级、某门课程的成绩小于某个分数的学生\n");
        printf("10.按照姓名排序\n");
        printf("11.保存当前信息\n");
        printf("其他,推出系统\n");
 
int x;
struct Student *h;
char y[15];
printf("亲输入编号:");
scanf("%d",&x); 
switch(x)
{
    case(1):
    h=input();
    save(h);
    break;
    case(2):
    printf("请输入要查找的文件名:\n");
    getchar();
    gets(s);
    h=creatlist(s);        
    printf("\n");
    printf("注册链表成功\n"); 
    break;
    case(3):
    printf("请输入要删除的学生的学号:\n");
    scanf("%s",y);
    h=del(h,y);
    break;
    case(5):
    printf("当前信息如下:\n");
    print(h);
    break; 
 
}
}
return 0;
}

自定义函数

struct Student * input()
{
    n=0;
    printf("请输入学生人数:");
    scanf("%d",&a);
    printf("请录入这%d名学生的信息:\n",a);
    struct Student *head;
    struct Student *p1,*p2;
    head=(struct Student *)malloc(LEN);
    
    while(n<a)
    {
        p1=(struct Student*)malloc(LEN);
        scanf("%s%s%s%d%d%d%d",p1->num,p1->name,p1->major,&p1->classNo,&p1->score[0],&p1->score[1],&p1->score[2]);
        p1->sum=0;
        p1->sum=p1->score[0]+p1->score[1]+p1->score[2];
        n++;
        if(n==1)
        {
            head->next=p1;
            p2=p1;
        }
        else
        {
            p2->next=p1;
            p2=p1;
            
            
            
        }
        p2->next=NULL;
        
    }
    
    
    
    
    
    
    
    return head;
}
void save(struct Student *head)
{
    struct Student *p1;
    p1=head->next;
    char s[15];
    
    FILE *fp;
printf("请输入要建立的文件的名称:\n"); 
    scanf("%s",s);
     if((fp=fopen(s,"wb"))==NULL)
     {
         
         printf("打开文件失败");
         exit(0); 
     }
    while(p1!=NULL)
    {
        if(fwrite(p1,LEN,1,fp)!=1)
        {
            printf("写入文件失败\n"); 
        }
        p1=p1->next;
    }
    
    printf("写入文件成功!\n"); 
    fclose(fp);

}
struct Student *creatlist(char *s)
{
    FILE *fp;
    struct Student *p1,*p2,*head;
    
    if((fp=fopen(s,"rb"))==NULL)
     {
         
         printf("打开文件失败");
         exit(0); 
     }
     head=(struct Student *)malloc(LEN);
    p1=(struct Student *)malloc(LEN);
     
    if((fread(p1,LEN,1,fp))==0)
    {
        
        printf("wrong\n");
        exit(0);
    }
    head->next=p1;
    p2=p1;
    while(p1->next!=NULL)
    {
        p1=(struct Student *)malloc(LEN);
        fread(p1,LEN,1,fp);
        p2->next=p1;
        p2=p1;
        
        
    }

    return (head);
    
    
    
    
    
    
    
}
struct Student *del(struct Student *head,char *s)
{
    struct Student *p1,*p2;
    p2=head;
    p1=head->next;

    int w=atoi(s),e=atoi(p1->num);
    while(w!=e&&p1->next!=NULL)//判断是否符合条件 
    {
        p2=p2->next;
        p1=p1->next;
        e=atoi(p1->num);
    }
    
    p2->next=p1->next;
    
    
    return head;
}
void print(struct Student*head)
{
    struct Student *p;
    printf("\n学号\t姓名\t专业  \t\t班级   成绩0   成绩1   成绩2   \t"); 
    p=head->next;//从第二个开始打印 
    while(p!=NULL)
    {
    printf("\n%s\t%-6s\t%-10s\t%d\t%d\t%d\t%d\t", p->num, p->name, p->major,p->classNo,p->score[0],p->score[1],p->score[2]);
        p=p->next;//循环 
    }
    printf("\n");
}



函数声明

struct Student {
    
    char num[10];//学号
        char name[15];//姓名 
        char major[10];//专业computer,softwear,network
        int classNo;//班级 
        int score[3];//3门课的成绩  
        int sum;//3门课的总成绩 
        struct Student *next;//指针    88u

    
    
    
};
int n,a;
struct Student * input();
struct Student *creatlist(char *s); 
void save(struct Student *head);
void print(struct Student*head);
struct Student *del(struct Student *head,char *s);

  • 收藏

2条回答 默认 最新

  • baidu_30233079 2021-09-11 16:46
    已采纳

    删除函数没有考虑没找到的情况,没找到情况你也执行 p2->next=p1->next;就把第一个删除了

    已采纳该答案
    打赏 评论
  • no_sying_nothing 2021-09-15 14:40

    把删除条件限定一下

        while(w!=e&&p1->next!=NULL)//判断是否符合条件 
        {
            p2=p2->next;
            p1=p1->next;
            e=atoi(p1->num);
        }
        if(w == e){
          p2->next=p1->next;
        }
    
    
    
    打赏 评论

相关推荐 更多相似问题