C语言带头链表
第二章:带头链表
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
上一章我们讲述用C语言描述了一个不带头的链表,以及实现了它的增删改查,这章,我将用C语言描述一个带头结点链表的创建。
提示:结尾部分附加整体程序
一、头结点的作用
头结点可以用来存储一些关于链表的长度,大小等相关信息,方便了操作的统一。
二、描述
1.定义结构体
代码如下(示例):
#include<stdio.h>
#include<stdlib.h>
typedef struct Node *head;//头指针用它定义
typedef struct Node List;//结点用它来定义
struct Node
{
int data;
struct Node *next;
};
int main(int *argc, char **argv)
{
List *node=NULL;//定义结点
head Head=NULL;//头
//{}这里添加相关链表操作
return 0;
}
2.初始化头结点
代码如下(示例):
void List_Init(head *p)//初始化
{
*p=(head)malloc(sizeof(List));//申请一个头指针空间
(*p)->next=NULL;
}
3:用头插法创建链表
void List_create(head p)
{
List *node;
int a=0;
while(1)
{
scanf("%d",&a);
if(a<0)return;
node = (List *)malloc(sizeof(List));
node->data = a;
node->next=p->next;//从前边插入
p->next=node;//指向新插入的结点
}
}
尾插法
void List_create_tail(head p)//尾插法
{
List *node,*tail;
int a=0;
tail=p;
while(tail->next)//移动到尾巴结点
{
tail=tail->next;
}
while(1)
{
scanf("%d",&a);
if(a>=0)
{
node = (List *)malloc(sizeof(List));
node->data=a;
tail->next=node;
printf("p=%p tail=%p\n",p,tail);
tail=node;
printf("tail=%p node=%p p=%p\n",tail,node,p);
}
else
{
tail->next=NULL;//将最后一个一定要置空最后一步操作是tail=node;
//tail->next=p;//循环链表
return;
}
}
return;
}
4:打印
void List_printf(head p)//P指向上一个node;
{
List *x;
int i=0;
x=p->next;//让X指向第一个结点
while(x!=NULL)
{
printf("第%d个=%d\n",++i,x->data);
x=x->next;
}
return;
}
总结
提示:带头结点的链表在结构上不同于不带头的链表,但是操作方法上依然相吻合,不带都结点的增删改查依然适用于带头结点,这里就不再多写,如果有想学习的伙伴可以看我的上一节内容,不带头的链表,里边详细介绍了增删改查的流程。
下面是以上程序的整个工程文件,复制可用
/*
作者:亿只萌新
年龄:21
婚姻状况:单身
程序内容:带头结点的链式存储链表
*/
#include <stdio.h>
#include <stdlib.h>
typedef struct Node *head;//头指针用它定义
typedef struct Node List;//结点用它来定义
struct Node
{
int data;
struct Node *next;
};
void List_Init(head *p)//初始化
{
*p=(head)malloc(sizeof(List));//申请一个头指针空间
(*p)->next=NULL;
}
void List_create(head p)
{
List *node;
int a=0;
while(1)
{
scanf("%d",&a);
if(a<0)return;
node = (List *)malloc(sizeof(List));
node->data = a;
node->next=p->next;//从前边插入
p->next=node;//指向新插入的结点
}
}
void List_create_tail(head p)//尾插法
{
List *node,*tail;
int a=0;
tail=p;
while(tail->next)//移动到尾巴结点
{
tail=tail->next;
}
while(1)
{
scanf("%d",&a);
if(a>=0)
{
node = (List *)malloc(sizeof(List));
node->data=a;
tail->next=node;
printf("p=%p tail=%p\n",p,tail);
tail=node;
printf("tail=%p node=%p p=%p\n",tail,node,p);
}
else
{
tail->next=NULL;//将最后一个一定要置空最后一步操作是tail=node;
//tail->next=p;//循环链表
return;
}
}
return;
}
void List_printf(head p)//P指向上一个node;
{
List *x;
int i=0;
x=p->next;//让X指向第一个结点
while(x!=NULL)
{
printf("第%d个=%d\n",++i,x->data);
x=x->next;
}
return;
}
int main(int *argc, char **argv)
{
List *node=NULL;//定义结点
head Head=NULL;//头
List_Init(&Head);//初始化
List_create(Head);//头插入
List_create(Head);
List_create_tail(Head);//尾插入
List_create_tail(Head);
List_printf(Head);
return 0;
}
还没有点收藏的小伙伴不要愣着了哦,下一期我们更新双链表和广义表。
想要了解更多内容,欢迎加群讨论