欢迎加qq群:453398542 学习讨论,会定期分享资料课程,解答问题。
1、 有10个学生,每个学生的数据包括学号、姓名和1门课成绩,编写如下函数:
(1) 根据学生的信息建立链表;
(2) 输出链表;
(3) 输入一个学生的学号,查找链表中是否有该学生;
(4) 在第i个学生前插入一个学生信息;
(5) 删除链表中第i个学生。
#include<stdio.h>
#include<stdlib.h>
#define N 10
typedef struct Student{
int num;
char name[20];
float score;
}S;
typedef struct Node{
S date;
struct Node *next;
}Node,*LinkList;
LinkList createlist(int n){
int i;
LinkList head,pre,p;
head=pre=(LinkList)malloc(sizeof(Node));
for(i=0;i<n;i++){
p=(LinkList)malloc(sizeof(Node));
scanf("%d%s%f",&(p->date.num),p->date.name,&(p->date.score));
pre->next=p;
pre=p;
}
pre->next=NULL;
return head;
}//输入
void output(LinkList head){
LinkList p;
p=head->next;
while(p!=NULL){
printf("%5d%10s%5.1f\n",p->date.num,p->date.name,p->date.score);
p=p->next;
}
printf("\n");
}//输出
void search(LinkList head,int n){
LinkList p;
p=head->next;
while(p!=NULL)
if(p->date.num==n)
break;
else
p=p->next;
if(p==NULL)
printf("表中无学号为%d的学生。\n",n);
else
{
printf("满足条件的同学的信息如下:\n");
printf("%8d%10s%.1f",p->date.num,p->date.name,p->date.score);
}
printf("\n");
}//查找
LinkList insert_node(LinkList head,int i,S st){
int j;
LinkList p,s;
p=head; j=0;
while(p!=NULL&&j<i){
j++; p=p->next;
}
if(!p||j>i){
printf("传递的参数非法\n");
return NULL;
}
s=(LinkList)malloc(sizeof(Node));
s->date=st;
s->next=p->next;
p->next=s;
return 0;
} //插入
LinkList delete_node(LinkList head,int i){
int j;
LinkList p,q;
p=head; j=1;
while(p->next!=NULL&&j<i){
j++; p=p->next;
}
if(!p->next||j>i){
printf("传递的数据非法\n");
return NULL;
}
q=p->next; p->next=q->next;
free(q);
return head;
}//删除
int main(){
int i,n,a,b;
S stu;
LinkList head;
printf("输入学生个数:\n");
scanf("%d",&n);
head=createlist(n);
output(head);
printf("输入一个学生的学号:\n");
scanf("%d",&a);
search(head,a);
printf("插入一个学生;\n");
scanf("%d%s%f",&stu.num,stu.name,&stu.score);
printf("输入插入位置:\n");
scanf("%d",&i);
insert_node(head,i,stu);
printf("删除第%d个学生;\n",i);
delete_node(head,i);
output(head);
return 0;
}