/* 前言: 好多天前准备记录下自己的坎坷修仙的点滴,以后希望能留下【珍贵的回忆】,萌新的日常代码,大佬互喷*/
代码写的比较繁琐,多多见谅,萌新每天都在努力改变自己
# 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;
}