^0^大家知道怎样用C语言实现单链表吗
Posted 歌咏^0^
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了^0^大家知道怎样用C语言实现单链表吗相关的知识,希望对你有一定的参考价值。
前言:今天我来讲讲C语言如何实现传统的链表,顾名思义,传统的就是过去的,在实际项目中很少用到的,与现在的主流的抽象链表(如,linux内核双向循环链表)相比存在着致命的缺陷,但是,凡事多有个但是啊,看问题要看本质;传统链表相比更容易理解和掌握。话不多说,今日我们 讲讲带头结点的单向链表,相信我们都有收货^0^:
一、概念:
链表,既链式存储线性表。
链表有两类:
1.有头结点(头结点,不存储数据,负责管理整条链表的结点)的单向链表
2.以首结点开头,无头结点的单向链表(单向:只有上一个结点指向下一个结点的方向)
二、优点:
C语言中,链式存储通过指针实现,避免了顺序存储需要占用连续空间弊端(程序可申请的连续空间小,一般30Mb左右),又可以通过指针引用堆空间(程序可申请的空间,一般将达到2G左右)大大提高了数据存储量
除此之外,对于一些对增、删操作频繁的数据,链式存储相较于顺序存储更有优势
三、设计带头结点的单向链表步骤:
1.设计链表结点的结构体
struct node_linked_list{
int data;//存储数据
struct node_linked_list *next; //指向下一个结点的指针
};
2.设计头结点的结构体
//头结点我们可以形象的称之为管理员结构体
struct linked_list_head{
struct node_linked_list *head; //head指向链表的首结点
int nodeNumber; //记录除头结点外,整条链表的结点数目
};
3.初始化链表(我们考虑这条新链表有首结点,无首结点的空链表你们试试^0^)
/*
init_list_head():创造一条只有首结点的链表
参数:
int inputData 首结点要存入的数据
返回值:
成功 返回新链表的头结点
失败 返回NULL
*/
struct linked_list_head* init_list_head(int inputData)
{
//为头结点申请堆空间
struct linked_list_head* managerLinkedList = malloc(sizeof( struct linked_list_head));
if(managerLinkedList == NULL)
{
printf("申请头结点的堆空间失败\\n");
return NULL; //失败返回空指针NULL
}
//申请成功,头结点初始化
managerLinkedList->nodeNumber = 0;
managerLinkedList->head = NULL;
//为首结点申请空间
struct node_linked_list* newNode = malloc(sizeof( struct linked_list_head));
if(newNode == NULL)
{
printf("申请首结点的堆空间失败\\n");
return NULL; //失败返回空指针NULL
}
//申请成功,首结点初始化
newNode->data = inputdata
newNode->next = NULL;
//头结点指向首结点
managerLinkedList->head = newNode;
return mangerLinkedList; //返回头结点
}
4.头插法,增加链表结点
/*
add_head_linked_list()采用头插法,存储链表数据
参数:
struct linked_list_head* managerLinkedList 指明被插入结点的链表头结点
int inputData 插入的数据
返回值
成功/失败 链表的头结点
*/
struct linked_list_head* add_head_linked_list(struct linked_list_head* managerLinkedList,int inputData)
{
//申请新结点的堆空间
struct node_linded_list* newNode = malloc(sizeof(struct node_linded_list));
//申请失败
if(newNode == NULL)
{
printf("新结点申请堆空间失败\\n");
return managerLinkedList;
}
//初始化新结点
newNode->data = inputData;
newNode->next = NULL;
//头插法,插入链表中
newNode->next = managerLinkedList->head;//新结点先指向首结点
managerLinkedList->head = newNode;//最后头结点再指向新结点
return managerLinkedList;//返回头结点
}
好了^0^, 今天就到这里了,亲!!
相信对应聪明的你来说,实现一些操作应该是下意思,为您推荐:实现链表的增删查改,进一步的有,链表的排序等
别忘了点赞,拜!!
以上是关于^0^大家知道怎样用C语言实现单链表吗的主要内容,如果未能解决你的问题,请参考以下文章