作者在 2013-01-06 17:21:26 发布以下内容
/*
学生信息删除函数,删除指定学号的学生信息,
传递给该函数的实参是所建立的单链表的头指针L、要删除的学生学号。
若删除成功,返回值为1,否则,返回值为0。
*/
#include<stdio.h>
#include<stdlib.h>
#define N 2
typedef struct stud
{
int num;
char name[10];
float score[N+1];
struct stud *next;
}NODE;
NODE *create();
int Delete(NODE **p_head, int *per);
void print(NODE *head);
//主函数
int main()
{
NODE *L;
int n=1, i;
L=create();
print(L);
//printf("请输入要删除学生的学号:\n");
//scanf("%d\n", &n);
i=Delete(&L, &n);
print(L);
printf("i=%d\n", i);
return 0;
}
NODE *create() //创建链表,返回表头指针
{
NODE *head,*p,*q;
int i;
head=(NODE *)malloc(sizeof(NODE));
p=head;
for(i=1;i<N;i++)
{
printf("请依次输入第%d个学生的学号、姓名、分数(以空格键隔开):\n",i);
scanf("%d %s",&p->num,p->name);
for(int k=0;k<N+1;k++)
scanf("%f",&p->score[k]);
q=(NODE *)malloc(sizeof(NODE));
p->next=q;
p=p->next;
}
printf("请依次输入第%d个学生的学号、姓名、分数(以空格键隔开):\n",i);
scanf("%d %s",&p->num,p->name);
for(int r=0;r<N+1;r++)
scanf("%f",&p->score[r]);
p->next=NULL;
return head;
}
//学生信息删除函数,删除指定学号的学生信息
int Delete(NODE **p_head, int *per)
{
NODE *p,*q;
p=*p_head;
if(p==NULL) //空指针,删除失败,返回0
return 0;
if(p->num==*per) //删除节点在头指针处
{
*p_head=p->next;
free(p);
return 1;
}
else
{
while(p->num!=*per&&p->next!=NULL)
{
q=p;
p=p->next;
}
if(p->num==*per) //已找到,删除该节点
{
q->next=p->next;
free(p);
return 1;
}
else //链表中不存在指定学号的学生
return 0;
}
}
void print(NODE *head) //输出链表中信息
{
NODE *p;
p=head;
if(p==NULL)
printf("该链表为空!");
else
{
while(p->next!=NULL)
{
printf("姓名:%s\n 学号:%d\n",p->name,p->num);
for(int j=0;j<N+1;j++)
printf("分数:%4f",p->score[j]);
printf("\n");
p=p->next;
}
printf("姓名:%s\n 学号:%d\n",p->name,p->num);
for(int j=0;j<N+1;j++)
printf("分数:%4f",p->score[j]);
printf("\n");
}
}