C语言链表梳理-5-排序

#include <stdio.h>

struct Person {
	char * Name;
	int    Age;
	struct Person * Next;
};

struct List {
	char * Name;
	struct Person * Next;
};

void InitList(struct List *pList, char *Name)
{
	pList->Name = Name;
	pList->Next = NULL;
}

void AddItemToList(struct List *pList, struct Person *NewPerson)
{
	struct Person * Last;
	
	/* 如果是空链表 */
	if (pList->Next == NULL)
	{
		pList->Next = NewPerson;
		NewPerson->Next =NULL;
		return;
	}
	/* 如果不是空链表 */
	Last = pList->Next;
	while (Last->Next)
	{
		Last = Last->Next;
	}
	
	/* Last->Next == NULL */
	Last->Next = NewPerson;
	NewPerson->Next = NULL;
}
void DelItemFromList(struct List *pList, struct Person * CurPerson)
{
	struct Person *P = pList->Next;
	struct Person *Pre = NULL;
	
	/* 找到person */
	while (P != NULL && P != CurPerson)
	{
		/* 后面还有人, 移动到下一个 */
		Pre = P;
		P = P->Next;
	}
	
	/* 退出的条件: P==NULL, P == person */
	if (P == NULL)
	{
		printf("can not find the person to del\r\n");
		return;
	}
	
	if (Pre == NULL) /* 前面无人, 表示要删除的是第1项 */
	{
		pList->Next = P->Next;
	}
	else
	{
		Pre->Next = P->Next;
	}	
}

void SortList(struct List * pList)
{
	struct Person * Pre;
	struct Person * Next;
	
	char * TempName;
	int TempAge;
	
	Pre = pList->Next;
	
	if (Pre == NULL)
		return;
	
	while (Pre)
	{
		Next = Pre->Next;
		
		while (Next)
		{
			if (Pre->Age > Next->Age)
			{
				/* 当前是交换值不是交换位置  不是很好的方法 */
				TempName	= Pre->Name;
				Pre->Name  	= Next->Name;
				Next->Name 	= TempName;

				TempAge   	= Pre->Age;
				Pre->Age  	= Next->Age;
				Next->Age 	= TempAge;
			}
			Next = Next->Next;
		}
		
		Pre = Pre->Next;
	}
}

void PrintList(struct List *pList)
{
	int i = 0;
	
	struct Person *P = pList->Next;
	
	while (P != NULL)
	{
		printf("Person %d: %s is %d\r\n", i++, P->Name, P->Age);
		
		/* 后面还有人, 移动到下一个 */
		P = P->Next;
	}
}

int main(void)
{
	struct List A_List;
	int i = 0;

	struct Person P[] = {
		{"P0", 19, NULL},
		{"P1", 11, NULL},
		{"P2", 17, NULL},
		{"P3", 13, NULL},
		{"P4", 18, NULL},
		{"P5", 15, NULL},
		{"P6", 16, NULL},
		{"P7", 12, NULL},
		{NULL,  0, NULL}, /* 依次判定是否是最后一个元素 */
	};

	InitList(&A_List, "A_class");
	
	while (P[i].Name != NULL)
	{
		AddItemToList(&A_List, &P[i]);
		i++;
	}
	PrintList(&A_List);
	
	
	DelItemFromList(&A_List, &P[3]);
	printf("del person %s:\r\n", P[3].Name);
	PrintList(&A_List);


	DelItemFromList(&A_List, &P[0]);
	printf("del person %s:\r\n", P[0].Name);
	PrintList(&A_List);
	
	SortList(&A_List);
	printf("sort list, all person:\r\n");
	PrintList(&A_List);
	
	
	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值