【 日常 】 链表的游标 17年4月01日20:39 [ 4 ]

/* 前言: 好多天前准备记录下自己的坎坷修仙的点滴,以后希望能留下【珍贵的回忆】,萌新的日常代码,大佬互喷*/

代码写的比较繁琐,多多见谅,萌新每天都在努力改变自己

# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>
# define THE_SPACE_SIZE 10
struct List_Node
{
	int data;
	int position_pNext;
};
void init_list(void);
void add_list(int);
void sert_list(int,int);
void delete_list(void);
void clean_list(void);
void sort_list(void);
void treval_list(void);	      //遍历
bool is_empty(void);	     //判空
int find_node_position(int);//查找结点内容的位置
int Arrary_Alloc(void);
void Arrary_Free(int);
int statistic_the_number(void);

//-------------全局------------------
List_Node Arrary[THE_SPACE_SIZE];
List_Node Free_list[THE_SPACE_SIZE];
//-----------------------------------

int main(void)
{
	init_list();
	add_list(2);
	add_list(13);
	add_list(42);
	add_list(6);
	add_list(22);
	add_list(16);
	add_list(32);
	add_list(21);
	add_list(12);
	printf("遍历输出 :\n");
	treval_list();
	//-------------------------
	/*
	delete_list();
	printf("\n删除后链 :\n");
	treval_list();
	*/
	//------------注释可用------
	sert_list(66,5);       //1 数据,2 位置( 插入 )
	printf("\n插入后链 :\n");
	treval_list();
	sort_list();
	printf("\n排序后:\n");
	treval_list();

	clean_list();	//清空链
	printf("\n");
	system("pause");
	return 0;
}
void init_list(void)
{
//		初始化  链头
//------------------------------------------------------------------
	Arrary[0].data = 0;              //头结点数据域随便放
	Arrary[0].position_pNext = 0;	// 指针域 0  代表 NULL
//------------------------------------------------------------------
//		初始化 free 表
//------------------------------------------------------------------
	for (int i = 0; i < THE_SPACE_SIZE; ++i)       // 0-9 的表内存初始化 【假设长度为 10 】
	{
		Free_list[i].position_pNext = i + 1;     // 0-1
		Free_list[i].data = 0;                  //0 无含义
		if (i == THE_SPACE_SIZE - 1)	       // 9-0
			Free_list[i].position_pNext = 0;
	}
//------------------------------------------------------------------
	return;
}
void add_list(int add_data)
{
	int position;
	position = Arrary_Alloc();//取有效内存
	if (!position)
	{
		printf("\n ERROR :get memory fail  \n");
		return;
	}
	Arrary[position].data = add_data;
	Arrary[position].position_pNext = 0;	 //标记 末尾
	int pFound = Arrary[0].position_pNext;	//哨兵指向头指针的下一个
	if (pFound)                            // pFound 存在 (去找末端)
	{
		while (Arrary[pFound].position_pNext)         //哨兵的下一个节点也是存在的
		{
			pFound = Arrary[pFound].position_pNext;	//取下个结点的 【指针域】
		}
		Arrary[pFound].position_pNext = position;//出while 说明下个不存在,直指pos
	}
	else                                        //pFound 不存在
		Arrary[0].position_pNext = position;   //头指针为空---直接指向Pos
}
void sert_list(int  sert_data,int sert_position)
{
	if (statistic_the_number() < sert_position || sert_position <= 0)//确认位置且在总数内
	{
		printf("\n\nERROR: 插入节点的位置有误,请重新确认\n");
		return;
	}
	int position;
	position = Arrary_Alloc();//取有效内存
	if (!position)
	{
		printf("\n ERROR :get memory fail  \n");
		return;
	}
	Arrary[position].data = sert_data;
	Arrary[position].position_pNext = 0;   //标记 末尾
	int pFound = Arrary[0].position_pNext;//哨兵指向头指针的下一个
	int pFront = 0;	                     // 哨兵前指针
	for (int i = 1; i < sert_position; ++i)
	{ 
		pFront = pFound;
		pFound = Arrary[pFound].position_pNext;	//下行 xing
	}
	Arrary[position].position_pNext = pFound;
	Arrary[pFront].position_pNext = position;
	return;
}
void sort_list(void)
{
	//内部调用声明:
	int find_max(int,int);
	int N = statistic_the_number();	// N 作为下行的界	(统计个数)
	int i;
	int max = 0;
	int temp = find_max(N, 0);      //查找max temp 保存第一次max的下标
	int pFront;                    // 查找前驱
	for (i = 0; i < N; ++i)
	{
		if (i == 0)
			max = find_max(N - i, 0);	//查找max
		else
			max = find_max(N-i,temp);	//查找max
		for (pFront=0; pFront < N; ++pFront)		
			if (Arrary[pFront].position_pNext == max)
				break;
		Arrary[pFront].position_pNext = Arrary[max].position_pNext;//前驱越过max到后继
		Arrary[max].position_pNext = Arrary[0].position_pNext;    //max指向0后
		Arrary[0].position_pNext = max;	                         // 0 指向 0后 
	}
}
int find_max(int N,int temp)
{
	if (N <= 1)
		return Arrary[temp].position_pNext;	 //如果只有一个定是 temp 后
	int max = Arrary[temp].position_pNext;	// 把第一次temp的下一个结点当max的起始点
	int pFound = Arrary[max].position_pNext;// max 的下一个
	for (int i = 2; i <= N; ++i)			
	{
		if (Arrary[max].data > Arrary[pFound].data)//if( < ) max-2 max-1 max
			max = pFound;
		pFound = Arrary[pFound].position_pNext;
	}
	return max;
}
int find_node_position(int find_element)//整个代码块和按照元素删除的代码块一样
{
	int pFound = Arrary[0].position_pNext;                //哨兵指向头指针的下一个
	while (pFound&&Arrary[pFound].data != find_element)  //pFound存在并且不等于查找元素
		pFound = Arrary[pFound].position_pNext;         //下行 xing
	if (!pFound)
	{
		printf("\n ERROR:该链中不存在该元素\n");
		return -1;
	}
	if (Arrary[pFound].data == find_element)
		return pFound;
}
void clean_list(void)
{
	int pFound = Arrary[0].position_pNext;//设置下行哨兵
	int pFree = pFound;
	while (pFound)
	{
		pFound = Arrary[pFound].position_pNext; //哨兵下行侦查
		Arrary_Free(pFree);                    // 将 当前节点释放,存储回 freelist 中
		pFree = pFound;                       //当前释放
	}
	return;
}
void delete_list(void)
{
	//声明:
	void delete_list_in_Element(int);
	void delete_list_in_number(int);
	printf("\n  请问您选择哪种删除方法:\n");
	printf("【1】方式:  删除第几个节点	\n");
	printf("【2】方式:  删除元素的节点	\n");
	int choice;
	scanf("%d", &choice);
	if (choice == 1)
	{
		int delete_number;
		printf("\n请输入要删除的结点位置");
		rewind(stdin);
		scanf("%d", &delete_number);
		delete_list_in_number(delete_number);
	}
	else if (choice == 2)
	{
		int delete_element;
		printf("\n请输入要删除的结点元素");
		rewind(stdin);
		scanf("%d", &delete_element);
		delete_list_in_Element(delete_element);
	}
	else
		printf("\n您的输入选择有误\n");
}
void delete_list_in_Element(int delete_element)
{
	int pFound = Arrary[0].position_pNext;//哨兵指向头指针的下一个
	int pFront = 0;                     // 哨兵前指针
	while (pFound&&Arrary[pFound].data != delete_element)//pFound存在并且不等于删除元素
	{
		pFront = pFound;                        //pFront 跟踪 pFound
		pFound = Arrary[pFound].position_pNext;//下行 xing
	}
	if (!pFound)
	{
		printf("\n ERROR:该链中不存在该元素\n");
		return;
	}
	if (Arrary[pFound].data == delete_element)
	{
		Arrary[pFront].position_pNext = Arrary[pFound].position_pNext;//越过pFound
		Arrary_Free(pFound);//将 哨兵节点释放,存储回 freelist 中
		return;
	}
}
void delete_list_in_number(int delete_number)
{
	
	if (statistic_the_number() < delete_number || delete_number <= 0)//确认位置且在统计总数内
	{
		printf("\n\nERROR: 删除节点的位置有误,请重新确认\n");
		return;
	}
	int pFound = Arrary[0].position_pNext;//哨兵指向头指针的下一个
	int pFront = 0;                      //哨兵前指针
	for (int i = 1; i < delete_number; ++i)
	{
		pFront = pFound;
		pFound = Arrary[pFound].position_pNext;//下行 xing
	}
	Arrary[pFront].position_pNext = Arrary[pFound].position_pNext;//前指向哨兵后
	Arrary_Free(pFound);//将 哨兵节点释放,存储回 freelist 中
}
int Arrary_Alloc(void)
{
	int position;
	position = Free_list[0].position_pNext;// position 指向 freelist 0的下一个
	Free_list[0].position_pNext = Free_list[position].position_pNext;// freelsit 0 pnext —> position的下一个,越过position
	return position;
}
void Arrary_Free(int back_position)
{
	Free_list[back_position].position_pNext = Free_list[0].position_pNext;
	Free_list[0].position_pNext = back_position;
	return;
}
void treval_list(void)
{
	if (is_empty())
		return;
	int pFound = Arrary[0].position_pNext;//侦查哨兵
	while (pFound)//pFound 存在
	{
		printf("%d\t", Arrary[pFound].data);
		pFound = Arrary[pFound].position_pNext;//下行 xing
	}
	return;
}
int statistic_the_number(void)//统计个数
{
	if (is_empty())
		return 0;
	int pFound = Arrary[0].position_pNext;//侦查哨兵
	int sum_number = 0;
	while (pFound)
	{
		sum_number++;
		pFound = Arrary[pFound].position_pNext;
	}
	return sum_number;
}
bool is_empty(void)
{
	if (Arrary[0].position_pNext == 0)
		return true;
	else
		return false;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值