一、头文件
#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;
}
四、结果