本程序为提供可执行链表的必要环节,所以单独拎出来。
理解即可
头插法(逆序输出)(不推荐)
/*
本程序为提供可执行链表的必要环节,所以单独拎出来。
理解即可
头插法(逆序输出)(不推荐)
*/
//头文件
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
//结构
typedef struct List //单链表的结构
{
int data; //单链表的数据域
struct List *NEXT; //单链表的指针域
}Sqlist, *PList;
//函数声明
PList List_initialize(void); //初始化单链表
void List_valuation(PList); //用户自定义开辟结点数量和对每个结点的赋值
//函数区
PList List_initialize(void) //初始化单链表
{
PList PHead = NULL; //将头结点挂起
PHead = (PList)malloc(sizeof(Sqlist)); //开辟头结点
if (NULL == PHead) //判断是否开辟成功
{
printf("初始化链表失败,检查程序\n"); //提醒用户开辟状态
exit(1); //非正常退出程序
}
PHead->NEXT = NULL; //将头结点挂起
return PHead; //返回开辟成功的头指针
}
void List_valuation(PList PHead) //用户自定义开辟结点数量和对每个结点的赋值
{
PList PTail = NULL; //用于操作链表的指针
PList PNew = NULL; //用于开辟新结点的指针
int i, len, val;
printf("输入要开辟的结点个数:");
scanf_s("%d", &len); //输入要开辟的个数
PTail = PHead; //将头指针赋给PTail,注意不能写成PTail = PHead->NEXT,因为PHead->NEXT为NULL
for (i = 1;i <= len;i++) //建立链表
{
printf("输入第%d个结点的值:", i);
scanf_s("%d", &val); //依次输入各个结点的值
PNew = (PList)malloc(sizeof(Sqlist)); //开辟新结点
if (NULL == PNew) //如果分配失败
{
printf("初始化赋值时,建立新结点失败,检查程序!\n"); //显示错误位置,方便检查
exit(1); //非正常终止程序
}
PNew->data = val; //使新结点的数据域赋值
PNew->NEXT = NULL; //使新结点的指针域挂起
PNew->NEXT = PTail->NEXT; //将新结点挂在表头
PTail->NEXT = PNew; //使PTail指向新结点
}
}
void List_output(PList PHead) //单链表的输出
{
PList PTail = NULL; //用于操作链表的指针
PTail = PHead->NEXT; //将第一个结点的位置赋给PTail
printf("\n当前链表的值为:");
while (NULL != PTail) //当前结点不为空
{
printf("%d ", PTail->data); //输出当前结点的数据域
PTail = PTail->NEXT; //使PTail指向下一个结点
}
printf("\n");
}
//主函数
int main(void)
{
PList PHead = NULL; //头结点挂起
PHead = List_initialize(); //初始化单链表
List_valuation(PHead); //用户自定义开辟结点数量和对每个结点的赋值
List_output(PHead); //单链表的输出
return 0;
}
注意,头插法如果正常头结点开始则结果是逆序输出,它的算法是
PNew->data = val; //使新结点的数据域赋值
PNew->NEXT = NULL; //使新结点的指针域挂起
PNew->NEXT = PTail->NEXT; //将新结点挂在表头
PTail->NEXT = PNew;
小工具,希望对你有所帮助
感谢观看
再次感谢~