编写一个函数实现对学生数据的操作,每个学生结点包括学号和一门课程的成绩。 要求: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; }