链表

插入删除遍历查询释放逆序排序

#include "link.h"

enum command {link_clear, link_insert, link_delete, link_print, link_search, link_free, link_rever, link_sort, link_quit};

//打印菜单
void link_print_menu(void)
{
	system("cls");
	printf("---------------MENU--------------------\n");
	printf("#clear  :清除屏幕信息\n");
	printf("#insert :添加学生信息\n");
	printf("#delete :删除学生信息\n");
	printf("#print  :遍历学生信息\n");
	printf("#search :查询学生信息\n");
	printf("#free   :释放学生信息\n");
	printf("#rever  :逆置学生信息\n");
	printf("#sort   :排序学生信息\n");
	printf("#quit   :推出学生系统\n");
	printf("----------------ENDL-------------------\n");
}
//创造头节点
STU* link_create_head(void)
{
	STU* head = (STU*)(calloc(1, sizeof(STU)));
	head->next = NULL;
	return head;
}
//获取命令
int get_which_command(void)
{
	char get_command[16] = "";
	char* link_command[10] = { "clear", "insert", "delete", "print", "search", "free", "rever", "sort", "quit"};

	printf("请输入指令:");
	scanf("%s", get_command);
	if (strcmp(link_command[link_clear], get_command) == 0)
		return link_clear;
	else if (strcmp(link_command[link_insert], get_command) == 0)
		return link_insert;
	else if (strcmp(link_command[link_delete], get_command) == 0)
		return link_delete;
	else if (strcmp(link_command[link_print], get_command) == 0)
		return link_print;
	else if (strcmp(link_command[link_search], get_command) == 0)
		return link_search;
	else if (strcmp(link_command[link_free], get_command) == 0)
		return link_free;
	else if (strcmp(link_command[link_rever], get_command) == 0)
		return link_rever;
	else if (strcmp(link_command[link_sort], get_command) == 0)
		return link_sort;
	else if (strcmp(link_command[link_quit], get_command) == 0)
		return link_quit;
	else
		return -1;
}
//执行命令
void x_shell(STU* head)
{
	int which_command = -1;
	which_command = get_which_command();
	switch (which_command)
	{
		case link_clear:
			link_print_menu();
			break;
		case link_insert:
			link_head_insert(head);
			//head = link_tail_insert(head);
			//head = link_sort_insert(head);
			break;
		case link_delete:
			link_stu_delete(head);
			break;
		case link_print:
			link_stu_print(head);
			break;
		case link_search:
			link_stu_search(head);
			break;
		case link_free:
			link_stu_free(head);
			break;
		case link_rever:
			link_stu_rever(head);
			break;
		case link_sort:
			link_stu_sort(head);//冒泡
			//link_stu_sort2(head);//选择
			break;
		case link_quit:
			link_stu_quit(head);
			break;
		default:
			printf("Command not found!\n");
			break;
	}
}
//头部插入
void link_head_insert(STU* head)
{
	STU* pInsert = (STU*)calloc(1, sizeof(STU));

	if (pInsert == NULL)
	{
		perror("collac");
	}
	printf("请输入学生姓名、年龄、学号:");
	scanf("%s%d%d", pInsert->name, &pInsert->age, &pInsert->id);

	pInsert->next = head->next;
	head->next = pInsert;
}
//尾部插入
void link_tail_insert(STU* head)
{
	STU* pCurrent = head;
	STU* pInsert = (STU*)calloc(1, sizeof(STU));

	if (pInsert == NULL)
	{
		perror("collac");
	}
	printf("请输入学生姓名、年龄、学号:");
	scanf("%s%d%d", pInsert->name, &pInsert->age, &pInsert->id);

	while (pCurrent->next != NULL)
		pCurrent = pCurrent->next;
	pCurrent->next = pInsert;
	pInsert->next = NULL;
}
//顺序插入
void link_sort_insert(STU* head)
{
	STU* pPre = head;
	STU* pCurrent = head->next;
	STU* pInsert = (STU*)calloc(1, sizeof(STU));

	if (pInsert == NULL)
	{
		perror("calloc");
		return;
	}
	
	printf("请输入学生姓名、年龄、学号:");
	scanf("%s%d%d", pInsert->name, &pInsert->age, &pInsert->id);

	while (pCurrent != NULL)
	{
		if (pInsert->id <= pCurrent->id)
			break;
		pPre = pCurrent;
		pCurrent = pCurrent->next;
	}
	pPre->next = pInsert;
	pInsert->next = pCurrent;
}
//遍历
void link_stu_print(STU* head)
{
	STU* pCurrent = head->next;

	if (pCurrent == NULL)
	{
		printf("没有学生信息!\n");
	}
	else
	{
		while (pCurrent != NULL)
		{
			printf("姓名:%-10s年龄:%-5d学号:%-5d\n", pCurrent->name, pCurrent->age, pCurrent->id);
			pCurrent = pCurrent->next;
		}
	}
}
//查找
void link_stu_search(STU* head)
{
	STU* pCurrent = head->next;
	char name[32] = "";

	printf("请输入要查找的学生的姓名:");
	scanf("%s", name);
	while (pCurrent != NULL)
	{
		if (strcmp(name, pCurrent->name) == 0)
		{
			printf("姓名:%-10s年龄:%-5d学号:%-5d\n", pCurrent->name, pCurrent->age, pCurrent->id);
			return;
		}
		pCurrent = pCurrent->next;
	}
	printf("查无此人!\n");
}
//删除
void link_stu_delete(STU* head)
{
	STU* pCurrent = head->next;
	STU* pPre = head;
	char name[32] = "";

	printf("请输入要查找的学生的姓名:");
	scanf("%s", name);
	while (pCurrent != NULL)
	{
		if (strcmp(name, pCurrent->name) == 0)
		{
			pPre->next = pCurrent->next;
			free(pCurrent);
			printf("查找成功,删除成功!\n");
			return;
		}
		pPre = pCurrent;
		pCurrent = pCurrent->next;
	}
	printf("删除失败,查无此人!\n");
}
//释放
void link_stu_free(STU* head)
{
	STU* pCurrent = head->next;

	while (pCurrent != NULL)
	{
		head->next = pCurrent->next;
		free(pCurrent);
		pCurrent = head->next;
	}
	printf("释放成功!\n");
}
//逆序
void link_stu_rever(STU* head)
{
	STU* pPre = head->next;
	STU* pCurrent = pPre->next;
	STU* temp = NULL;
	
	if (head->next == NULL || head->next->next == NULL)
		return;

	while (pCurrent != NULL)
	{
		temp = pCurrent->next;
		pCurrent->next = pPre;
		pPre = pCurrent;
		pCurrent = temp;
	}
	head->next->next = NULL;
	head->next = pPre;
	printf("逆序成功!\n");
}
//冒泡排序
void link_stu_sort(STU *head)
{
	/*for(i = 0; i < n - 1; i++)
		for(j = i; j < n; j++)*/
	STU* pPre = NULL;
	STU* pCurrent = NULL;

	for (pPre = head->next; pPre->next != NULL; pPre = pPre->next)
	{
		for (pCurrent = pPre->next; pCurrent != NULL; pCurrent = pCurrent->next)
		{
			if (pPre->id > pCurrent->id)
			{
				STU temp;
				temp = *pCurrent;
				*pCurrent = *pPre;
				*pPre = temp;

				temp.next = pCurrent->next;
				pCurrent->next = pPre->next;
				pPre->next = temp.next;
			}
		}
	}
}
//选择排序
void link_stu_sort2(STU* head)
{
	/*for(i = 0; i < n - 1;i++)
		for(min = i, j = min + 1; j < n; j++)*/
	STU* pPre = NULL;
	STU* pCurrent = NULL;
	STU* pMin = NULL;

	for (pPre = head->next; pPre->next != NULL; pPre = pPre->next)
	{
		for (pMin = pPre, pCurrent = pMin->next; pCurrent != NULL; pCurrent = pCurrent->next)
		{
			if (pPre->id > pCurrent->id)
			{
				STU temp;
				temp = *pCurrent;
				*pCurrent = *pPre;
				*pPre = temp;

				temp.next = pCurrent->next;
				pCurrent->next = pPre->next;
				pPre->next = temp.next;
			}
		}
	}
}
//退出
void link_stu_quit(STU* head)
{
	link_stu_free(head);
	exit(0);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值