【C语⾔】单链表的初始化,创建和输出
链表主要分为四种:单向链表,双向链表,单向循环链表,双向循环链表。这⾥的单链表默认为单项⾮循环链表。
要确定⼀个数组,需要知道两个参数,⼀个是数组名,即数组⾸元素地址,另⼀个是数组元素个数。⽽要确定⼀个单链表,只需要知道头指针,因为头指针指向头结点,头结点存放⾸结点的地址,⾸结点存放下⼀个结点的地址,······,直到最后⼀个结点。
所以单链表的初始化就是创建⼀个头指针,指向头结点,⽽头结点的指针域为空,表⽰空单链表。
单链表的创建可以分为两种⽅法:⼀是在单链表的尾部插⼊新结点,即数据读⼊顺序和结点顺序完全相同,称为尾插法,⼆是在单链表的头部插⼊新结点,即数据读⼊顺序与结点顺序完全相反,称为头插法。
尾插法是从⼀个空链表开始,重复读⼊数据,⽣成新结点,将数据放⼊新结点的数据域中,然后将新结点插⼊到当前链表的尾部,直到读⼊结束标志为⽌。注意:因为尾结点⼀直在变化,所以我们增加⼀个指针 move 来始终指向尾结点,以便新结点的插⼊。
头插法是从⼀个空链表开始,重复读⼊数据,⽣成新结点,将数据放⼊新结点的数据域中,然后将新结
点插⼊到当前链表的头部,直到读⼊结束标志为⽌。注意:链表其实是从⾸结点开始的,因为头结点的数据域中不放数据,所以新结点插⼊到⾸结点的位置。
单链表的输出即单链表中各数据的遍历。需要定义⼀个临时指针来进⾏循环操作。
将各部分模块化,即写成函数,在主调函数中调⽤即可。
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int data;
struct node* next;
}Node;
//单链表的初始化,即创建⼀个头指针或者说头结点,因为头指针指向头结点-------------------------
Node* List()
{
Node* head =(Node*)malloc(sizeof(Node));//head是头指针,指向头结点
head->next =NULL;                      //头结点的指针域为空,即⾸结点的地址为空
return head;                            //返回头指针,因为只要确定了头指针,就确定了⼀个链表
}
//尾插法创建单链表------------------------------------------------------------------------
void CreatByRear(Node* head)
{
Node* move =head;//⽬的是让头结点⼀直不动,move⼀直指向尾结点
Node* newnode;  //指向新结点
int data;
printf("请输⼊数字(输⼊ -1 代表结束):");
while (1)
{
scanf("%d",&data);
if (-1==data)
break;
else
{
newnode      =(Node*)malloc(sizeof(Node));
newnode->data =data;
move->next    =newnode;
move          =newnode;
}
}
move->next =NULL;//因为move⼀直指向尾结点,⽽尾结点的指针域为空
}
//头插法创建单链表------------------------------------------------------------------------void CreatByHead(Node* head)
{
Node* newnode;//指向新结点
int data;
printf("请输⼊数字(输⼊ -1 代表结束):");
while (1)
{
scanf("%d",&data);
if (-1==data)
break;
else
{
newnode      =(Node*)malloc(sizeof(Node));
newnode->data =data;
newnode->next =head->next ;//先让新结点的指针域存放原来⾸结点的地址  head->next    =newnode;    //再让新结点成为⾸结点
}
}
}
//输出链表-------------------------------------------------------------------------------void Output(Node* head)
{
Node* tempnode;      //循环时所⽤的临时指针
tempnode=head->next ;//临时指针从⾸结点开始移动
while (tempnode)
{
printf("%d ",tempnode->data );
tempnode=tempnode->next ;
}
sizeof 指针
printf("\n");
}
//主函数---------------------------------------------------------------------------------
int main(void)
{
Node* head1;        //定义尾插法建⽴的单链表头指针
Node* head2;        //定义头插法建⽴的单链表头指针
head1=List();        //初始化单链表
CreatByRear(head1);  //尾插法创建单链表
Output(head1);      //输出单链表
head2=List();        //初始化单链表
CreatByHead(head2);  //头插法创建单链表
Output(head2);      //输出单链表
return 0;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。