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;
}