链表之创建链表


代码编译平台:

CentOS 6.4 64b
gcc (GCC) 4.4.7


传统数组缺点:

传统数组长度需要事先设定,不能改变,内存由系统自动分配,函数调用结束后系统自动回收,不能跨函数调用。


链表:

内存空间不要求连续,增删操作灵活。


链表之创建链表_第1张图片

链表由头指针、头结点、首节点、普通节点和尾节点组成。

每个节点有两个部分,一个是数据,一个是存放下一个节点的节点指针。

头指针:指向头结点的指针,通过头指针便可对链表进行所有操作。

头结点:链表的第一个节点,其不存放有效数据,其指针指向首节点。

首节点:第一个存放有效数据的节点。 

尾节点:存放有效数据,但其指针是空(NULL)。


注:除头结点之外,其他都是有效节点,如果只有头结点,即头结点的指针为空,则表示此链表为空链表。


代码实现(C):


节点的结构体

struct NODE
{
	int data; 
	struct NODE * pNext; 
};


通过CreateList函数实现链表的创建。


链表之创建链表_第2张图片

首先创建出头指针和头节点,并创建操作指针pOperate方便后续操作,代码如下: 

struct NODE * pMntHead = (struct NODE *) malloc(sizeof(struct NODE *)) ;
struct NODE * pOperate = pMntHead;
pOperate->pNext = NULL;


创建节点:

创建数据节点和临时节点指针pMnt,实用此指针完成数据节点的数据存储

int value; //通过用户输入取值
struct NODE * pMnt = (struct NODE *) malloc(sizeof(struct NODE *));
pMnt->data = value;

链表之创建链表_第3张图片

节点连接:

将数据节点的指针置空(将每个新节点当做尾节点看待),并将链表的尾节点指向此节点(节点连接)

 
pMnt->pNext = NULL;
pOperate->pNext = pMnt;

最后移动pOperate指针,准备添加下一个节点

pOperate = pMnt;

链表之创建链表_第4张图片

至此,一个只有一个数据节点的链表就添加完成了,其他数据节点类似操作, 完整代码如下:

#include <stdio.h>
#include <malloc.h>

struct NODE
{
	int data; 
	struct NODE * pNext; 
}; //定义节点

struct NODE * CreateList(void); //创建链表,并返回链表地址 
void ShowList(const struct NODE *); //显示链表数据

int main(void)
{
	struct NODE * pHead; 
	pHead = CreateList(); 
	ShowList(pHead);
	printf("\n");
	return 0; 
}

struct NODE * CreateList(void)
{
	int list_len;
	int i;
	int value; 
	struct NODE * pMntHead = (struct NODE *) malloc(sizeof(struct NODE *)) ; //创建头指针和头结点
	struct NODE * pOperate = pMntHead;
	pOperate->pNext = NULL;
	
	printf("Input the list length: ");
	scanf("%d", &list_len);
	for(i=0; i<list_len; i++)
	{
		printf("Input the value of %d : ", i);
		scanf("%d", &value);
		struct NODE * pMnt = (struct NODE *) malloc(sizeof(struct NODE *)); //创建一个新的数据节点
		
		pMnt->data = value; 
		pMnt->pNext = NULL;
		pOperate->pNext = pMnt;  //连接节点
		pOperate = pMnt;
	}
	return pMntHead;  //返回所创建链表的头结点地址
}

// 显示一个链表的所有内容
void ShowList(const struct NODE * pMntHead)
{
	while(pMntHead->pNext != NULL)
	{
		pMntHead = pMntHead->pNext; 
		printf("%d ", pMntHead->data);
	}
}


演示:

[root@ly ~]# 
[root@ly ~]# ls
x.c
[root@ly ~]# gcc x.c
[root@ly ~]# ls
a.out  x.c
[root@ly ~]# ./a.out 
Input the list length: 5
Input the value of 0 : 100
Input the value of 1 : 123
Input the value of 2 : 454
Input the value of 3 : 23
Input the value of 4 : 455

100 123 454 23 455 
[root@ly ~]# 
[root@ly ~]#



本文出自 “逆行者” 博客,谢绝转载!

你可能感兴趣的:(数据结构,c,链表,语言)