一、头文件
#ifndef __LINK_H__
#define __LINK_H__
#include <myhead.h>
#define MAX 30
// 建立学生结构体
typedef struct student
{
int id; //学号
char name[20]; //姓名
float score; //分数
}stu;
typedef struct node
{
union{
int len;
stu data;
};
struct node * next;
}Link, *Plink;
/**********函数声明**********/
//创建头结点
Plink set_up_link();
//判空
int empty(Plink L);
//1.输入学生信息
stu input_student(stu * people);
//2.头插法输入
void head_sert(Plink L, stu people);
//3.遍历单链表
void output_link(Plink L);
//
int input_sub();
//4.任意位置插入一个完整学生信息
void any_sert(Plink L, int sub, stu key);
//5.任意位置删除一个完整学生信息
void any_delete(Plink L, int sub);
//6.单链表逆置
void reverse_link(Plink L);
//7.按照学生成绩排序
void bubble_sort(Plink L);
#endif
二、功能函数
0.准备创建节点
//1.创建头结点
Plink set_up_link()
{
Plink L = malloc( sizeof(Link) );
if(NULL == L){
printf("创建失败!\n");
return NULL;
}
L->len = 0;
L->next = NULL;
return L;
}
//判空
int empty(Plink L)
{
if(NULL == L)
{
printf("创建失败!\n");
return 1;
}
return 0;
}
1.头插法输入
//输入学生信息
stu input_student(stu * people)
{
printf("请输入学生信息:\n");
printf("学号:");
scanf("%d", &people->id);
printf("姓名:");
scanf("%s", people->name);
printf("分数:");
scanf("%f", &people->score);
return *people;
}
//2.头插法输入
void head_sert(Plink L, stu people)
{
if(empty(L)) return;
Plink p = malloc(sizeof(Link));
p->data = people;
p->next = L->next;
L->next = p;
L->len++;
}
2.遍历单链表
//3.遍历单链表
void output_link(Plink L)
{
Plink t = L;
for(int i=0; i<L->len; i++){
printf("学号%d\t姓名%s\t分数%.2f\n",t->next->data.id, t->next->data.name, t->next->data.score);
t = t->next;
}
}
3.任意位置插入一个完整学生信息
//请输入插入/删除位置
int input_sub()
{
int sub;
printf("请输入插入/删除位置:");
scanf("%d",&sub);
return sub;
}
//4.任意位置插入一个完整学生信息
void any_sert(Plink L, int sub, stu key)
{
if(empty(L) || sub<1 || sub>L->len+1) return;
Plink t = L;
for(int i=1; i<sub; i++){
t = t->next;
}
Plink p = malloc(sizeof(Link));
p->data = key;
p->next = t->next;
t->next = p;
L->len++;
}
4.任意位置删除一个完整学生信息
//5.任意位置删除一个完整学生信息
void any_delete(Plink L, int sub)
{
if(empty(L) || sub<1 || sub>L->len) return;
Plink t = L;
for(int i=1; i<sub; i++){
t = t->next;
}
Plink Q = t->next;
t->next = t->next->next;
L->len--;
free(Q);
Q = NULL;
}
5.单链表逆置
//6.单链表逆置
void reverse_link(Plink L)
{
if(empty(L)) return;
Plink t = L->next;
Plink q = t->next;
while(q!=NULL){
t->next = q->next;
q->next = L->next;
L->next = q;
q = t->next;
}
}
6.按照学生成绩排序
//7.按照学生成绩排序
void bubble_sort(Plink L)
{
if(empty(L)) return;
for(int i=0; i<L->len; i++){
for(Plink j=L->next; j->next != NULL; j=j->next){
if( j->data.score > j->next->data.score ){
int temp = j->data.score;
j->data.score = j->next->data.score;
j->next->data.score = temp;
}
}
}
}
三、主函数
#include "link.h"
int main(int argc, const char *argv[])
{
//创建头结点
Plink L = set_up_link();
while(1){
printf("\t\t===学生信息管理系统===\n");
printf("\t\t1.头插法输入\n");
printf("\t\t2.遍历单链表\n");
printf("\t\t3.任意位置插入一个完整学生信息\n");
printf("\t\t4.任意位置删除一个完整学生信息\n");
printf("\t\t5.单链表逆置\n");
printf("\t\t6.按照学生成绩排序\n");
printf("\t\t0.退出\n");
int choice;
printf("请选择:");
scanf("%d",&choice);
switch(choice){
case 1: //1.头插法输入
int n;
printf("请输入学生人数:");
scanf("%d",&n);
stu people;
for(int i=0; i<n; i++){
input_student(&people);
head_sert(L,people);
}
break;
case 2: //2.遍历单链表
output_link(L);
break;
case 3: //3.任意位置插入一个完整学生信息
int sub0 = input_sub();
stu key = input_student(&people);
any_sert(L, sub0, key);
output_link(L);
break;
case 4://4.任意位置删除一个完整学生信息
int sub1 = input_sub();
any_delete(L , sub1);
output_link(L);
break;
case 5: //5.单链表逆置
reverse_link(L);
output_link(L);
break;
case 6: //6.按照学生成绩排序
bubble_sort(L);
output_link(L);
break;
case 0: //0.退出
return 0;
default :
printf("请重新选择:");
scanf("%d",&choice);
break;
}
}
free(L);
L = NULL;
return 0;
}
四、结果