严蔚敏数据结构C语⾔版的单链表头插法(逆序输出)(纯敲代码)——中职严蔚敏数据结构C语⾔版的头插法(逆序输出)
/*
严蔚敏数据结构C语⾔版 P31 算法2.11
逆位序输⼊n个元素的值,建⽴带表头结点的单链线性表L
因与尾插法的区别不⼤,所以初始化的过程搬运过来。重点在于头插法(逆序输出)
*/
//头⽂件
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
//结构
c语言struct头文件typedef struct LIST //该链表的结构
{
int data;//该单链表的数据域
struct LIST *NEXT;//该链表的指针域
}SQlist,*PList;
//函数声明
PList List_initialize(void);//初始化单链表,并返回头指针
void List_the_assignment(PList);//⽤户⾃定义要开辟的结点数并赋予每个结点数据
void List_output(PList);//单链表的输出
void List_drop(PList);//在带头结点的单链线性表L中,删除第i个元素
//函数区
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_the_assignment(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");//显⽰错误位置,⽅便检查
printf("初始化赋值时,建⽴新结点失败,检查程序!\n");//显⽰错误位置,⽅便检查
exit(1);//⾮正常终⽌程序
}
/*头插法正式开始*/
PNew->data = val;//头插法(逆序输出)开始,赋值
PNew->NEXT =NULL;//挂起新结点的指针域
PNew->NEXT = PHead->NEXT;//将新结点插⼊表头
PHead->NEXT = PNew;//使头结点指向新结点
}
}
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_the_assignment(PHead);//⽤户⾃定义要开辟的结点数并赋予每个结点数据(采⽤头插法)List_output(PHead);//单链表的输出
return0;
}
说明:因其他步骤⼏乎⼀致,所以照搬了以前的程序,在这⾥可以看到
//主函数
int main(void)
{
PList PHead =NULL;//使主函数的头指针挂起
PHead =List_initialize();//初始化单链表,并把返回的头指针给主函数的头指针
List_the_assignment(PHead);//⽤户⾃定义要开辟的结点数并赋予每个结点数据(采⽤头插法)List_output(PHead);//单链表的输出
return0;
}
主函数的这⾥是运⽤了头插法进⾏输⼊并逆序输出的
List_the_assignment(PHead);//⽤户⾃定义要开辟的结点数并赋予每个结点数据(采⽤头插法)下⾯是头插法的程序与尾插法的对⽐
:
这是头插法
PNEW 代表的是动态开辟新的结点,data是数据域,NEXT是指针域,PHead是头结点
/*头插法的伪代码*/
PNew->data = val;//头插法(逆序输出)开始,赋值
PNew->NEXT =NULL;//挂起新结点的指针域
PNew->NEXT = PHead->NEXT;//将新结点插⼊表头
PHead->NEXT = PNew;
这是尾插法
PNEW 代表的是动态开辟新的结点,data是数据域,NEXT是指针域,PTail是前⼀个结点
/*尾插法的伪代码*/
PNew->data = val;//使新结点的数据域赋值
PNew->NEXT =NULL;//使新结点的指针域挂起
PTail->NEXT = PNew;//将新结点挂在前⼀个结点
PTail = PNew;//使PTail指向下⼀个元素
总结:头插法的运⽤实际运⽤不如尾插法实际,按照正常思维来说有序⼀个个往后排才是普遍的逻辑,虽然实际运⽤不如尾插法但仍有它的好处。逆序输出便是其中之⼀,所以得了解并掌握即可。
⼼得:当我看到这个算法2.11的时候头插法逆序输出,⼀开始很迷惑,后来思维就开始演练,想象出内存的空间和头插法的实现,发现,其实代码不⽤刻意的去理解去背,理解的不是代码⽽是理解实现
⽬的⽽使⽤的⽅式⽅法,理解了⽅式⽅法后代码的敲出⾃然是⽔到渠成的东西~
感谢观看~
再次感谢——
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论