C语言怎么用链表删除学生信息呢?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct student
{
	int num;
	char name[20];
	char sex[20];
	int English;
	int C;
	int sum;
	struct student *next;  //指向下个结点的指针 
};

void login();//登录 
void select();//控制函数(菜单) 
void input(struct student *p,FILE *fp,int n);//输入学生信息 
void output(struct student *p,FILE *fp,int n);//浏览(输出)学生信息 
int query(struct student *p,FILE *fp,int n);//查询学生信息 
void remove(struct student *p,FILE *fp,int n);//删除学生信息 
void sort(struct student *p,FILE *fp,int n);//统计(排序)学生成绩

int main()
{
	struct student s[200];
	FILE *fp;
	int n;
	
	//login();//登录
	
	int option;//菜单选择
	
	while(1)
	{
		select();//控制函数(菜单) 
	    printf("请输入你的选择: "); 
	    scanf("%d",&option);
	
	    switch(option)
	    {
		    case 1:
			    printf("请输入学生人数: ");
	            scanf("%d",&n);//输入当前学生人数(n)
			    input(s,fp,n);//输入
			    break;
		    case 2:
			    output(s,fp,n);//输出(浏览)
			    break;
		    case 3: 
		    //    query(s,fp,n);//查询 
		        break;
	    	case 4: 
	    		remove(s,fp,n);//删除 
		    	break;
	    	case 5:
		    //    sort(s,fp,n);//排序 
		    	break;
	    	case 0:
			    exit(0);//正常退出 
		    	break;
	    	default:
		        printf("您的输入有误,请重新输入!\n");
	   }
	}
	return 0;
}

//控制函数 
void select()
{
	printf("*********主菜单*********\n");
	printf(" 1----------学生信息录入\n");
    printf(" 2----------学生信息浏览\n");
    printf(" 3----------学生信息查询\n");
	printf(" 4----------学生信息删除\n");
    printf(" 5----------学生成绩统计\n");
    printf(" 0----------退出系统\n");
	printf("************************\n");
}

//输入函数 
void input(struct student *p,FILE *fp,int n)
{
	int i;
	if((fp=fopen("student.txt","w"))==NULL)
	{
		printf("打开文件失败!");
		exit(0);
	}
	printf("请输入\n");
	printf("学号\t姓名\t性别\t英语成绩\tC语言成绩\n");
	for(i=0;i<n;i++)
	{
        scanf("%d\t%s\t%s\t%d\t%d",&p->num ,p->name ,p->sex ,&p->English ,&p->C );
	    p->sum = p->English +p->C ;
	    //fprintf(fp,"%d %s %s %d %d %d %d\n",p->num ,p->name ,p->sex ,p->English ,p->C ,p->sum );前后变量个数不同,导致产生随机数 
	    fprintf(fp,"%d %s %s %d %d %d\n",p->num ,p->name ,p->sex ,p->English ,p->C ,p->sum );
    }		
    if(fclose(fp))
	{
		printf("关闭文件失败!");
		exit(0); 
	}
}

//输出函数 
void output(struct student *p,FILE *fp,int n)
{
	
	int i;
	fp=fopen("student.txt","r");
	if(fp==NULL)
	{
		printf("信息未存储!");
		exit(0);
	}
	
	printf("学号\t姓名\t性别\t英语\tC语言\t总成绩\n");
	for(i=0;i<n;i++)
	{
	    fscanf(fp,"%d %s %s %d %d %d\n",&p->num ,p->name ,p->sex ,&p->English ,&p->C ,&p->sum );
		printf("%d\t%s\t%s\t%d\t%d\t%d\n",p->num ,p->name ,p->sex ,p->English ,p->C ,p->sum );
	}
    if(fclose(fp))
	{
		printf("关闭文件失败!");
		exit(0); 
	}
}

//删除函数 
void remove(struct student *p,FILE *fp,int n)
{
	int option;
	int i,j;
	int flag=0;
	int removenum;
	char removename[20];
	printf("*****删除*****\n");
	printf("[1] 按学号删除\n");
	printf("[2] 按姓名删除\n"); 
	printf("**************\n");
	printf("请输入你的选择: \n");
	scanf("%d",&option);
	
	if(option==1)
	{
		printf("请输入需删除信息的学生学号: ");
	    scanf("%d",&removenum); 
	    
	    struct student *head=NULL,*p1,*p2;
	    fp=fopen("student.txt","r");
	if(fp==NULL)
    {
	   printf("信息未存储!");
	   exit(0);
    }
	for(i=0;i<n;i++)
	    {
	    	p=(struct student *)malloc(sizeof(struct student));
		    fscanf(fp,"%d %s %s %d %d %d\n",&p[i].num ,p[i].name ,p[i].sex ,&p[i].English ,&p[i].C ,&p[i].sum );
		}
	    //被删除结点是表头结点 
	    while(head!=NULL && head->num ==removenum)
	    {
	    	p1=head;
	    	head=head->next;
	    	free(p1);
		}
		if(head==NULL)
		{
			exit(0);
		}
		
		//要被删除结点非表头结点 
		p1=head;
		p2=head->next ;
		while(p2!=NULL)
		{
			if(p2->num ==removenum)
			{
				p1->num =p2->num ;
				free(p2);
				break;
			}
			else
			{
				p1=p2;
			}
			p2=p1->next ;
		}
	    n--;
	    printf("学号\t姓名\t性别\t英语\tC语言\t总成绩\n");
        for(i=0;i<n;i++)
        {
            printf("%d\t%s\t%s\t%d\t%d\t%d\n",p[i].num, p[i].name, p[i].sex, p[i].English, p[i].C, p[i].sum);
        }
	    if(flag==0)
	    {
	    	printf("该学号不存在!\n");
	    	return remove(p,fp,n);
		}
	    /*if(fclose(fp))
    	{
	    	printf("关闭文件失败!");
		    exit(0); 
    	}
    	FILE *fp1;
    	fp1=fopen("student.txt","w");
    	for(i=0;i<n;i++)
        {
            fprintf(fp1,"%d\t%s\t%s\t%d\t%d\t%d\n",p[i].num, p[i].name, p[i].sex, p[i].English, p[i].C, p[i].sum);
        }
         if(fclose(fp1))
    	{
	    	printf("关闭文件失败!");
		    exit(0); 
    	}*/
        
	}
	
	else if(option==2)
	{
		
	}
	
	else
	{
		printf("无此选项! 请重新选择!\n");
		return remove(p,fp,n);
	}
}

编译通过,但没有运行结果,帮我调试一下啊啊啊啊啊啊啊

感谢感谢感谢

(正在大一,老师布置作业是学生信息管理系统,可以用数组完成,但链表始终不行,下面是我用数组写的代码)

然后想试试用链表删除学生信息,其他板块仍用数组

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct student
{
	int num;
	char name[20];
	char sex[20];
	int English;
	int C;
	int sum;
	//struct stu_node *next;  //指向下个结点的指针 
};

void login();//登录 
void select();//控制函数(菜单) 
void input(struct student *p,FILE *fp,int n);//输入学生信息 
void output(struct student *p,FILE *fp,int n);//浏览(输出)学生信息 
int query(struct student *p,FILE *fp,int n);//查询学生信息 
void remove(struct student *p,FILE *fp,int n);//删除学生信息 
void sort(struct student *p,FILE *fp,int n);//统计(排序)学生成绩 

int main()
{
	struct student s[200];
	FILE *fp;
	int n;
	
	login();//登录
	
	int option;//菜单选择
	
	while(1)
	{
		select();//控制函数(菜单) 
	    printf("请输入你的选择: \n"); 
	    scanf("%d",&option);
	
	    switch(option)
	    {
		    case 1:
			    printf("请输入学生人数:");
	            scanf("%d",&n);//输入当前学生人数(n)
			    input(s,fp,n);//输入
			    break;
		    case 2:
			    output(s,fp,n);//输出(浏览)
			    break;
		    case 3: 
		        query(s,fp,n);//查询 
		        break;
	    	case 4: 
	    		remove(s,fp,n);//删除 
		    	break;
	    	case 5:
		        sort(s,fp,n);//排序 
		    	break;
	    	case 0:
			    exit(0);//正常退出 
		    	break;
	    	default:
		        printf("您的输入有误,请重新输入!\n");
	   }
	}
	return 0;
}

//控制函数 
void select()
{
	printf("*********主菜单*********\n");
	printf(" 1----------学生信息录入\n");
    printf(" 2----------学生信息浏览\n");
    printf(" 3----------学生信息查询\n");
	printf(" 4----------学生信息删除\n");
    printf(" 5----------学生成绩统计\n");
    printf(" 0----------退出系统\n");
	printf("************************\n");
}

//登录函数
void login() 
{
	int option;
	printf("********登录********\n");
	printf(" 1----------用户登录\n");
	printf(" 0----------退出系统\n");
	printf("********************\n");
	printf("请输入你的选择: \n");
	scanf("%d",&option);
	if(option==1)
	{
		int i;//输入密码的第i次(i<=3) 
	    char username[20];//用户名 
	    char userkey[20];//用户名密码
	    for(i=1;i<=3;i++)
    	{
		    printf("请输入用户名: ");
		    scanf("%s",username);
		    printf("请输入用户密码: "); 
		    scanf("%s",userkey);
		    if(strcmp(username,"aa")==0 && strcmp(userkey,"0000")==0)
			{
				printf("登录成功!请继续操作!\n");
				break;
			}
		    else
			{
				printf("用户名或密码错误!您还有%d次机会!\n",3-i);
	        }
	    }
     	if(i>3)
	    {
		    printf("登录失败! 谢谢!\n");
		    exit(0);//输入次数达到上限,正常退出 
	    }
	}
	
	else if(option==0)
	{
		exit(0);//正常退出
	}
	
	else
	{
		printf("输入错误! 请重新输入!\n");
		return login();
	}
/*	switch(option)
	{
		case 1:
			 //输入用户名、密码进行登录 
			break;
		case 0:
			exit(0);//正常退出 
			break;
		default:
			printf("无此输入! 请重新输入!\n");
			break;
	}*/
}

//输入函数 
void input(struct student *p,FILE *fp,int n)
{
	int i;
	if((fp=fopen("student.txt","w"))==NULL)
	{
		printf("打开文件失败!");
		exit(0);
	}
	printf("请输入\n");
	printf("学号\t姓名\t性别\t英语成绩\tC语言成绩\n");
	for(i=0;i<n;i++)
	{
        scanf("%d\t%s\t%s\t%d\t%d",&p->num ,p->name ,p->sex ,&p->English ,&p->C );
	    p->sum = p->English +p->C ;
	    //fprintf(fp,"%d %s %s %d %d %d %d\n",p->num ,p->name ,p->sex ,p->English ,p->C ,p->sum );前后变量个数不同,导致产生随机数 
	    fprintf(fp,"%d %s %s %d %d %d\n",p->num ,p->name ,p->sex ,p->English ,p->C ,p->sum );
    }		
    if(fclose(fp))
	{
		printf("关闭文件失败!");
		exit(0); 
	}
}

//输出函数 
void output(struct student *p,FILE *fp,int n)
{
	
	int i;
	fp=fopen("student.txt","r");
	if(fp==NULL)
	{
		printf("信息未存储!");
		exit(0);
	}
	
	printf("学号\t姓名\t性别\t英语\tC语言\t总成绩\n");
	for(i=0;i<n;i++)
	{
	    fscanf(fp,"%d %s %s %d %d %d\n",&p->num ,p->name ,p->sex ,&p->English ,&p->C ,&p->sum );
		printf("%d\t%s\t%s\t%d\t%d\t%d\n",p->num ,p->name ,p->sex ,p->English ,p->C ,p->sum );
	}
    if(fclose(fp))
	{
		printf("关闭文件失败!");
		exit(0); 
	}
}

//查询函数 
int query(struct student *p,FILE *fp,int n)
{
	int i;
	int flag=0;   //判断是否在文件中找到学号或姓名 
	int option;
	int querynum;
	char queryname[20];
	printf("*****查询*****\n");
	printf("[1] 按学号查询\n");
	printf("[2] 按姓名查询\n");
	printf("**************\n");
	printf("请输入你的选择: \n");
	scanf("%d",&option);
	if(option==1)
	{
		printf("请输入查询学生的学号: ");
	    scanf("%d",&querynum); 
	    fp=fopen("student.txt","r");
	    if(fp==NULL)
	    {
		    printf("信息未存储!");
		    exit(0);
	    }
	    printf("学号\t姓名\t性别\t英语\tC语言\t总成绩\n");
	    for(i=0;i<n;i++)
	    {
		    fscanf(fp,"%d %s %s %d %d %d\n",&p->num ,p->name ,p->sex ,&p->English ,&p->C ,&p->sum );
		    if(querynum==p->num )
		    {
		        flag=1;
				printf("%d\t%s\t%s\t%d\t%d\t%d\n",p->num ,p->name ,p->sex ,p->English ,p->C ,p->sum );
				exit(0);
		    }
	    }
	    if(flag==0)
	    {
	    	printf("该学号不存在!\n");
	    	return query(p,fp,n);
		}
	    if(fclose(fp))
    	{
	    	printf("关闭文件失败!");
		    exit(0); 
    	}
	}
	else if(option==2)
	{
		printf("请输入查询学生的姓名: ");
	    scanf("%s",&queryname); 
	    fp=fopen("student.txt","r");
	    if(fp==NULL)
	    {
		    printf("信息未存储!");
		    exit(0);
	    }
	    printf("学号    姓名    性别    英语    C语言   总成绩\n");
	    for(i=0;i<n;i++)
	    {
		    fscanf(fp,"%d %s %s %d %d %d\n",&p->num ,p->name ,p->sex ,&p->English ,&p->C ,&p->sum );
			if(strcmp(queryname,p->name)==0 )
		    {
		        printf("%d\t%s\t%s\t%d\t%d\t%d\n",p->num ,p->name ,p->sex ,p->English ,p->C ,p->sum );
		        flag=1;
		    }
	    }
	    if(flag==0)
	    {
	    	printf("该姓名不存在!\n");
		}
	    if(fclose(fp))
    	{
	    	printf("关闭文件失败!");
		    exit(0); 
    	}
	}
	else
	{
		printf("无此选项! 请重新选择!\n");
		return query(p,fp,n);
	}
	//query()函数的组成结构 
	/*switch(option) 
	{
		case 1:按学号查询;break;
		case 2:按姓名查询;break;
		default:printf("无此选项! 请重新选择!\n");exit(0);
	}*/
}

//删除函数 
void remove(struct student *p,FILE *fp,int n)
{
	int option;
	int i,j;
	int flag=0;
	int removenum;
	char removename[20];
	printf("*****删除*****\n");
	printf("[1] 按学号删除\n");
	printf("[2] 按姓名删除\n"); 
	printf("**************\n");
	printf("请输入你的选择: \n");
	scanf("%d",&option);
	
	if(option==1)
	{
		printf("请输入需删除信息的学生学号: ");
	    scanf("%d",&removenum); 
	    fp=fopen("student.txt","r");
	    if(fp==NULL)
	    {
		    printf("信息未存储!");
		    exit(0);
	    }
	    for(i=0;i<n;i++)
	    {
		    fscanf(fp,"%d %s %s %d %d %d\n",&p[i].num ,p[i].name ,p[i].sex ,&p[i].English ,&p[i].C ,&p[i].sum );
		}
		for(i=0;i<n;i++)
		{
		    if(removenum==p[i].num )
		    {
		        flag=1;
		        for(j=i;j<n-1;j++)
		        {
		        	p[j]=p[j+1];
				}
				 break;
		    }
		   
	    }
	    n--;
	    printf("学号\t姓名\t性别\t英语\tC语言\t总成绩\n");
        for(i=0;i<n;i++)
        {
            printf("%d\t%s\t%s\t%d\t%d\t%d\n",p[i].num, p[i].name, p[i].sex, p[i].English, p[i].C, p[i].sum);
        }
	    if(flag==0)
	    {
	    	printf("该学号不存在!\n");
	    	return remove(p,fp,n);
		}
	    if(fclose(fp))
    	{
	    	printf("关闭文件失败!");
		    exit(0); 
    	}
    	FILE *fp1;
    	fp1=fopen("student.txt","w");
    	for(i=0;i<n;i++)
        {
            fprintf(fp1,"%d\t%s\t%s\t%d\t%d\t%d\n",p[i].num, p[i].name, p[i].sex, p[i].English, p[i].C, p[i].sum);
        }
         if(fclose(fp1))
    	{
	    	printf("关闭文件失败!");
		    exit(0); 
    	}
        
	}
	
	else if(option==2)
	{
		printf("请输入需删除信息的学生姓名: ");
	    scanf("%s",&removename); 
	    fp=fopen("student.txt","r");
	    if(fp==NULL)
	    {
		    printf("信息未存储!");
		    exit(0);
	    }
	    for(i=0;i<n;i++)
	    {
		    fscanf(fp,"%d %s %s %d %d %d\n",&p[i].num ,p[i].name ,p[i].sex ,&p[i].English ,&p[i].C ,&p[i].sum );
		}
		for(i=0;i<n;i++)
		{
		    if(strcmp(removename,p[i].name )==0)
		    {
		        flag=1;
		        for(j=i;j<n-1;j++)
		        {
		        	p[j]=p[j+1];
				}
				 break;
		    }
		   
	    }
	    n--;
	    printf("学号\t姓名\t性别\t英语\tC语言\t总成绩\n");
        for(i=0;i<n;i++)
        {
            printf("%d\t%s\t%s\t%d\t%d\t%d\n",p[i].num, p[i].name, p[i].sex, p[i].English, p[i].C, p[i].sum);
        }
	    if(flag==0)
	    {
	    	printf("该姓名不存在!\n");
	    	return remove(p,fp,n);
		}
	    if(fclose(fp))
    	{
	    	printf("关闭文件失败!");
		    exit(0); 
    	}
	}
	
	else
	{
		printf("无此选项! 请重新选择!\n");
		return remove(p,fp,n);
	}
}

//(成绩统计)排序函数 
void sort(struct student *p,FILE *fp,int n)
{
	struct student temp;
	int option;
	int i,j;
	printf("******成绩统计******\n");
	printf("[1] 按英语成绩统计\n");
	printf("[2] 按C语言成绩统计\n");
    printf("[3] 按总成绩统计\n"); 
	printf("********************\n");
	printf("请输入你的选择: \n");
	scanf("%d",&option);
	
	if(option==1||option==2||option==3) 
	{
		fp=fopen("student.txt","r");
	    if(fp==NULL)
	    {
		    printf("信息未存储!");
		    exit(0);
	    }
	    if(option==1)
    	{
    		for(i=0;i<n;i++)
	        {
	    	    fscanf(fp,"%d %s %s %d %d %d\n",&p[i].num ,p[i].name ,p[i].sex ,&p[i].English ,&p[i].C ,&p[i].sum );
	     	}
		    for(i=1;i<n;i++)  //用冒泡排序从大到小比较 
		    {
			    for(j=0;j<n-i;j++)
			    {
				    if(p[j].English <p[j+1].English )
			    	{
				    	temp=p[j];
				    	p[j]=p[j+1];
				    	p[j+1]=temp;
				    }
		    	}
		    }
		printf("名次\t学号\t姓名\t性别\t英语\n");
        for(i=0;i<n;i++)
        {
            printf("NO.%d\t",i+1);
            printf("%d\t%s\t%s\t%d\n",p[i].num, p[i].name, p[i].sex, p[i].English);
        }
	}
	else if(option==2)
	{
		for(i=0;i<n;i++)
	    {
	    	fscanf(fp,"%d %s %s %d %d %d\n",&p[i].num ,p[i].name ,p[i].sex ,&p[i].English ,&p[i].C ,&p[i].sum );
		}
		for(i=1;i<n;i++)  //用冒泡排序从大到小比较 
		{
			for(j=0;j<n-i;j++)
			{
				if(p[j].C <p[j+1].C )
				{
					temp=p[j];
					p[j]=p[j+1];
					p[j+1]=temp;
				}
			}
		}
		printf("名次\t学号\t姓名\t性别\tC语言\n");
        for(i=0;i<n;i++)
        {
           	printf("NO.%d\t",i+1);
            printf("%d\t%s\t%s\t%d\t\n",p[i].num, p[i].name, p[i].sex, p[i].C);
        }
	}
	else if(option==3)
	{
		for(i=0;i<n;i++)
	    {
	    	fscanf(fp,"%d %s %s %d %d %d\n",&p[i].num ,p[i].name ,p[i].sex ,&p[i].English ,&p[i].C ,&p[i].sum );
		}
		for(i=1;i<n;i++)  //用冒泡排序从大到小比较 
		{
			for(j=0;j<n-i;j++)
			{
				if(p[j].sum <p[j+1].sum )
				{
					temp=p[j];
					p[j]=p[j+1];
					p[j+1]=temp;
				}
			}
		}
		printf("名次\t学号\t姓名\t性别\t英语\tC语言\t总成绩\n");
        for(i=0;i<n;i++)
        {
           	printf("NO.%d\t",i+1);
            printf("%d\t%s\t%s\t%d\t%d\t%d\n",p[i].num, p[i].name, p[i].sex, p[i].English, p[i].C, p[i].sum);
        }
	}
	} 
	else{
		printf("无此选项! 请重新输入!");
		return sort(p,fp,n);
	} 
	//sort()函数的组成结构: 
	/*switch(option)
	{
		case 1:printf("按英语成绩统计\n");break;
		case 2:printf("按C语言成绩统计\n");break;
		case 3:printf("按总成绩统计\n");break;
		default:printf("无此选项! 请重新输入!\n");return sort(p,fp,n);
	}*/
}

 

删除链表元素,是找到那个元素,将当前元素的后节点指向前节点就行。