严蔚敏数据结构C语言版 P34 算法2.17
静态链表的插入:
由于严书静态链表写的不是很清楚(反正是可选章节得知道理解即可),这里采用大话数据结构的插入思想,当然还是自己理解敲出的,所以仅供参考
/*
严蔚敏数据结构C语言版 P34 算法2.17
静态链表的插入:
由于严书静态链表写的不是很清楚(反正是可选章节得知道理解即可),这里采用大话数据结构的插入思想,当然还是自己理解敲出的,所以仅供参考
*/
//头文件
#include<stdio.h>
#include<stdlib.h>
//宏区
#define SIZEMAXE 10
//结构
typedef struct
{
int data;
int NEXT;
}SqLink,PLink[SIZEMAXE];
//函数声明
void Null_link_list(PLink); //将静态链表初始化(先全挂在备用头结点下)
int allot_Link_list(PLink); //分配空闲结点
void Link_list_build(PLink); //静态链表的建立
void Link_printf(PLink); //输出静态链表的值
void Link_list_into(PLink); //静态链表的插入
//函数区
void Null_link_list(PLink Link) //将静态链表初始化(先全挂在备用头结点下)
{
int i = 0;
while (i < SIZEMAXE) //依次挂在备用头结点下
{
Link[i].NEXT = i + 1; //将下一个结点挂在前一个结点上
i++; //记录i
}
Link[SIZEMAXE - 1].NEXT = NULL; //将最后的尾巴挂起
}
int allot_Link_list(PLink Link) //分配空闲结点
{
int i;
if (i) //只要当前有分配的空间
{
i = Link[0].NEXT; //用个临时存储量存储可以分配的结点
Link[0].NEXT = Link[i].NEXT; //将被分配结点的下一个结点挂在备用头结点下
}
if(NULL == i) //如果没有可分配的备用结点
{
printf("没有可分配的空闲结点了,请重新检查程序!\n"); //提醒用户
exit(0); //正常终止程序
}
return i; //返回被分配结点的下标
}
void Link_list_build(PLink Link) //静态链表的建立
{
int S; //用于指向表尾
int val, j, wd;
int i = allot_Link_list(Link); //分配头结点
printf("输入要建立静态链表的结点个数(10 >= x > 0):"); //提示用户
scanf_s("%d", &val); //用户输入个数
while (SIZEMAXE < val || val <= 0)
{
printf("个数非法,重新输入结点个数(10 >= x > 0):"); //提示用户
scanf_s("%d", &val); //用户输入个数
}
S = i; //初始化移动游标
for(j = 1;j <= val;j++)
{
printf("输入第%d个结点的值:", j); //提示用户
scanf_s("%d", &wd); //输入值
S = allot_Link_list(Link); //分配空闲结点
Link[S].data = wd; //将值赋给新结点
Link[i].NEXT = S; //将新结点的值挂在前一个结点
i = S; //游标移动
}
Link[S].NEXT = NULL; //将有效结点的尾结点的游标挂起
}
void Link_printf(PLink Link) //输出静态链表的值
{
int i = Link[1].NEXT; //i指向第一个有效静态结点
printf("\n当前静态链表的数据为:");
while (i) //节点不为NULL
{
printf("%d ", Link[i].data); //输出当前结点的数据
i = Link[i].NEXT; //i指向下一结点的下标
}
printf("\n");
}
void Link_list_into(PLink Link) //静态链表的插入
{
int i, j, k, s, o;
printf("输入插入的位置:"); //提醒用户
scanf_s("%d", &i); //记录插入的位置
printf("输入插入的数据:"); //提醒用户
scanf_s("%d", &j); //记录插入的数据
while (SIZEMAXE < i || i <= 0)
{
printf("插入的位置非法,重新输入插入的位置:"); //提醒用户
scanf_s("%d", i); //重新记录插入的位置
printf("插入的数据非法,重新输入插入的数据:"); //提醒用户
scanf_s("%d", j); //重新记录插入的数据
}
s = 1; //s是指向有效结点的头游标
for (k = 1;k < i;k++) //找到插入结点的前一个结点
{
s = Link[k].NEXT; //s记录位置
k++; //记录循环的次数
}
o = allot_Link_list(Link); //分配空闲结点
Link[o].data = j; //数据发送给新分配的结点
Link[o].NEXT = Link[s].NEXT; //新分配的结点指向插入位置的结点
Link[s].NEXT = o; //原本插入位置的结点的前一个结点指向新分配的结点
}
//主函数
int main(void)
{
PLink Link; //创造空表
Null_link_list(Link); //将静态链表初始化(先全挂在备用头结点下)
Link_list_build(Link); //静态链表的建立
Link_printf(Link); //输出静态链表的值
Link_list_into(Link); //静态链表的插入
Link_printf(Link); //输出静态链表的值
return 0;
}
这是本程序的头文件
//头文件
#include<stdio.h>
#include<stdlib.h>
这是本程序的宏区
//宏区
#define SIZEMAXE 10
这是本程序的静态链表的结构
//结构
typedef struct
{
int data;
int NEXT;
}SqLink,PLink[SIZEMAXE];
这是本程序的函数声明:
//函数声明
void Null_link_list(PLink); //将静态链表初始化(先全挂在备用头结点下)
int allot_Link_list(PLink); //分配空闲结点
void Link_list_build(PLink); //静态链表的建立
void Link_printf(PLink); //输出静态链表的值
void Link_list_into(PLink); //静态链表的插入
这是本程序的静态链表初始化(先全挂在备用头结点下):
void Null_link_list(PLink Link) //将静态链表初始化(先全挂在备用头结点下)
{
int i = 0;
while (i < SIZEMAXE) //依次挂在备用头结点下
{
Link[i].NEXT = i + 1; //将下一个结点挂在前一个结点上
i++; //记录i
}
Link[SIZEMAXE - 1].NEXT = NULL; //将最后的尾巴挂起
}
这是本程序的分配空闲结点:
int allot_Link_list(PLink Link) //分配空闲结点
{
int i;
if (NULL != Link[0].NEXT) //只要当前有分配的空间
{
i = Link[0].NEXT; //用个临时存储量存储可以分配的结点
Link[0].NEXT = Link[i].NEXT; //将被分配结点的下一个结点挂在备用头结点下
}
else //如果没有可分配的备用结点
{
printf("没有可分配的空闲结点了,请重新检查程序!\n"); //提醒用户
exit(0); //正常终止程序
}
return i; //返回被分配结点的下标
}
这是本程序的静态链表的建立
void Link_list_build(PLink Link) //静态链表的建立
{
int S; //用于指向表尾
int val, j, wd;
int i = allot_Link_list(Link); //分配头结点
printf("输入要建立静态链表的结点个数(10 >= x > 0):"); //提示用户
scanf_s("%d", &val); //用户输入个数
while (SIZEMAXE < val || val <= 0)
{
printf("个数非法,重新输入结点个数(10 >= x > 0):"); //提示用户
scanf_s("%d", &val); //用户输入个数
}
S = i; //初始化移动游标
for(j = 1;j <= val;j++)
{
printf("输入第%d个结点的值:", j); //提示用户
scanf_s("%d", &wd); //输入值
S = allot_Link_list(Link); //分配空闲结点
Link[S].data = wd; //将值赋给新结点
Link[i].NEXT = S; //将新结点的值挂在前一个结点
i = S; //游标移动
}
Link[S].NEXT = NULL; //将有效结点的尾结点的游标挂起
}
这是本程序的插入操作:
void Link_list_into(PLink Link) //静态链表的插入
{
int i, j, k, s, o;
printf("输入插入的位置:"); //提醒用户
scanf_s("%d", &i); //记录插入的位置
printf("输入插入的数据:"); //提醒用户
scanf_s("%d", &j); //记录插入的数据
while (SIZEMAXE < i || i <= 0)
{
printf("插入的位置非法,重新输入插入的位置:"); //提醒用户
scanf_s("%d", i); //重新记录插入的位置
printf("插入的数据非法,重新输入插入的数据:"); //提醒用户
scanf_s("%d", j); //重新记录插入的数据
}
s = 1; //s是指向有效结点的头游标
for (k = 1;k < i;k++) //找到插入结点的前一个结点
{
s = Link[k].NEXT; //s记录位置
k++; //记录循环的次数
}
o = allot_Link_list(Link); //分配空闲结点
Link[o].data = j; //数据发送给新分配的结点
Link[o].NEXT = Link[s].NEXT; //新分配的结点指向插入位置的结点
Link[s].NEXT = o; //原本插入位置的结点的前一个结点指向新分配的结点
}
这是本程序的输出静态链表的值
void Link_printf(PLink Link) //输出静态链表的值
{
int i = Link[1].NEXT; //i指向第一个有效静态结点
printf("\n当前静态链表的数据为:");
while (i) //节点不为NULL
{
printf("%d ", Link[i].data); //输出当前结点的数据
i = Link[i].NEXT; //i指向下一结点的下标
}
printf("\n");
}
这是本程序的主函数部分:
int main(void)
{
PLink Link; //创造空表
Null_link_list(Link); //将静态链表初始化(先全挂在备用头结点下)
Link_list_build(Link); //静态链表的建立
Link_printf(Link); //输出静态链表的值
Link_list_into(Link); //静态链表的插入
Link_printf(Link); //输出静态链表的值
return 0;
}
模块处理,方便观看理解程序~
感谢观看
再次感谢~