编写一个函数实现对学生数据的操作,每个学生结点包括学号和一门课程的成绩。
要求:1输入若干学生的学号和成绩建立链表
2根据学号删除指定的学生结点
3插入给定的学生结点
4对链表进行输出
源代码:
#include<stdio.h>
#include<stdlib.h>
struct node
{
int number;
float score;
struct node *next;
};
typedef struct node SNODE;
//用于插入结点的函数
SNODE *insert_node(SNODE *head,int x,int y,float z)
{
SNODE *s,*p1,*p2;
s=(SNODE*)malloc(sizeof(SNODE)); //生成新的结点
s->number=y;
s->score=z;
p1=head;
p2=head->next;
while((p2!='0')&&p2->number!=x) //若链表非空且未到表尾,则查找X的位置
{
p2=p1;
p1=p1->next; //p2不断后移,p1始终指向p2的前趋结点
}
s->next=p2; //若X存在,则插入X前面,若X不存在,p为NULL,插入在表尾
p1->next=s;
return(head);
}
//用于删除结点的函数
SNODE *del(SNODE *head,int number)
{
SNODE *p1,*p2;;
if(head==NULL)
{
printf("链表为空");
return(head);
}
p1=head;
while(number!=p1->id&&p1->next!=NULL) //p1指向的不是要找的结点,并且后面好友结点
{
p2=p1;
p1=p1->next; //p1后移一个
}
if(number==p1->id) //找到要删除的结点
{
if(p1==head)
head=p1->next;
else
p2->next=p1->next;
printf("delete:%d\n",number);
}
else
printf("找不到该结点");
return (head);
}
//用于输出链表(访问)的函数
void print(SNODE *head)
{
SNODE *p;
p=head->next; //p指向头节点后的第一个结点
if(p=='0')
print("这是个空链表");
else
{
printf("学生信息为\n");
do
{
printf("%ld %.0f",p->id,p->score);
p=p->next;
}while(p!=NULL);
printf("end\n");
}
}
//生成链表的函数
SNODE *creat(SNODE *head)
{
int id;
float sco;
SNODE *s;
SNODE *r;
head=(SNODE*)malloc(sizeof(SNODE));
r=head;
printf("输入学号:");
scanf("%d",&id);
while(id!=-1)
{
printf("请输入分数:");
scanf("%f",&sco);
s=(SNODE*)malloc(sizeof(SNODE)); //申请新的结点
//将数据存放在新的节点中
{
s->number=id;
s->score=sco;
r->next=s;
}
//指针移动
r=s;
//输入下一个数据
printf("输入学号");
scanf("%d",&id);
}
r->next='\0';
return head;
}
//主函数
int main()
{
SNODE *head,*head2,*head3;
int ins_num;
float ins_score;
int x;
int del_num;
head=creat();
printf("原有链表内容为\n");
print(head);
printf("请输入要插入的学生信息的位置\n");
scanf("%d",&x);
printf("请输入新插入的学生的具体信息:");
scanf("%d %f",&ins_num,&ins_score);
head2=insert_node(head,x,ins_num,ins_score);
printf("插入之后的新的内容为:\n");
print(head2);
printf("请输入要删除的学号:");
scanf("%d",&del_num);
head3=del_node(head2,del_num);
printf("删除之后的内容为:");
print(head3);
return 0;
}