1,单向链表
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
typedef struct student
{
int num;//学号
char name[10];//姓名
struct student *next;//指针域
}STU;
void print_help()
{
puts("****************************");
puts("1.插入学生信息");
puts("2.遍历学生信息");
puts("3.查找学生信息");
puts("4.删除学生信息");
puts("5.按学号排序");
puts("6.逆序排序");
puts("7.查看帮助信息");
puts("8.退出管理系统");
puts("9.清空学生信息");
puts("****************************");
return ;
}
void link_insert(STU **p_head, STU *p_new)
{
STU *p_mov = *p_head;
if (*p_head == NULL)//空链表时
{
*p_head = p_new;
p_new->next = NULL;
}
else//有一个或以上链表时
{
while (p_mov->next != NULL)
{
p_mov = p_mov->next;
}
p_mov->next = p_new;
p_new->next = NULL;
}
}
void link_print(STU *head)
{
STU *p_mov = head;
while(p_mov != NULL)
{
printf("%d %s",p_mov->num, p_mov->name);
p_mov = p_mov->next;
printf("\n");
}
}
STU *link_search(STU *head, int num)
{
STU *p_mov = head;
while(p_mov->num != num && p_mov->next != NULL)
{
p_mov = p_mov->next;
}
if(p_mov->next == NULL && p_mov->num != num)
{
return NULL;
}
else
{
head = p_mov;
return head;
}
}
void link_del(STU **head, int num)
{
STU *p_mov = *head, *pf = *head;
while(p_mov->num != num && p_mov->next != NULL)
{
pf = p_mov;
p_mov = p_mov->next;
}
if(p_mov->num == num )
{
if(pf == p_mov)
{
*head = p_mov->next;
}
else
{
pf->next = p_mov->next;
}
free(p_mov);
}
else
{
puts("没有要删除的学生!");
}
}
void link_swap(STU *pf, STU *pb)
{
STU temp;
temp = *pf;
*pf = *pb;
*pb = temp;
//交换指针
temp.next = pf->next;
pf->next = pb->next;
pb->next = temp.next;
}
STU *link_order(STU *head)
{
STU *pf,*pb;
pf = head;
while(pf->next != NULL)
{
pb = pf->next;
while(pb != NULL)
{
if(pf->num > pb->num)
{
link_swap(pf,pb);
}
else if (pf->num == pb->num)//如果学号相同再比名字字母
{
if (*(pf->name) &g