绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
C语言,链表
2019-11-28 15:23:46

定义一个链表的节点

之前说到树,里面也有一个节点,节点是用来存数据的,不管是树还是其他什么数据结构,终的目的都是用来处理数据的,所以节点里面包含两个东西,一个是指针,指针可以指向其他位置,可以是下一个节点,可以是上一个节点,还有一个东西就是数据本身,我们用一个int来代表数据,如果是很复杂的数据,我们也可以用结构体表示。

typedef struct Node{
	int data;
	struct Node * next;
}*p_Node;

定义一个链表头结构体

链表头也可以是一个节点,可以认为他就是一个指针,这个指针就指向这个链表的表头,所以我们还是用上面的结构体来声明这个头节点,再换个名字就好了。

typedef struct head{
	p_Node root;
};

声明一个链表头

一个链表没有头是不行的,就像一个家庭没有户主是不行的,也像一个球队,如果没有队长也是不行的,我们打正式比赛,还需要教练,但是正常一个球队,我们必须有一个队长,队长非常重要,就像一个链表一样,链表头也是一样的重要。

/*初始化一个链表*/
	struct head p_head;
	/*链表为空,链表指向下一项为空,说明链表为空*/
	p_head.root = NULL;

我们的链表头是空的,没有指向任何地方,这样做有没有问题?所以执行了那几行代码后,会变成这个样子。

这里提一下,可能很多初学者觉得这个有没有问题,到底是不是这样的,我们回顾声明和定义,什么是声明,什么是定义呢?声明和定义的主要区别是有没有分配内存空间,我们使用

struct head p_head;

定义了一个指针,那么这个就需要分配内存空间。

向链表插入一个数据

插入数据的时候,因为我们需要该表头指针的位置,所以会做的判断,正常插入一个数据到链表里面去的时候,先是开辟一个节点,然后操作这个节点的next指针,然后让链表的尾部指向这个节点


链表源码示例

#include "stdio.h"
#include "stdlib.h"

typedef struct Node{
	int data;
	struct Node * next;
}*p_Node;

typedef struct head{
	p_Node root;
};

/*直接做插入的动作,不给head 单独分配内存*/
int list_insert(struct head * p_head,int data)
{
	/*新建一个节点*/
	p_Node pTemp = (p_Node)malloc(sizeof(struct Node));
	/*把数据放入这个新建的节点里面*/
	pTemp->data = data;
	pTemp->next = NULL;	
	
	if(p_head->root == NULL)
	{
		p_head->root = pTemp;
		printf("#1list_insert:%d\n",data);
		return (0);
	}else{

		/*找到链表的尾部节点*/
		p_Node pTemp1 = p_head->root;
		while(pTemp1->next != NULL)
		{
			pTemp1 = pTemp1->next;
		}
		
		/*插入新节点*/
		pTemp1->next =  pTemp;
		
		printf("#2list_insert:%d\n",data);
		return (0);
	}
}

int list_traverse(p_Node node)
{
	if(node == NULL)
	{
		printf("list_traverse: pHead null \n");
		return (-1);
	}	
	
	p_Node pTemp1 = node;
	while(pTemp1 != NULL)
	{
		printf("data:%d\n",pTemp1->data);
		pTemp1 = pTemp1->next;
	}
}

int main()
{
	int i = 0;
	printf("main Entering ...\n");
	/*初始化一个链表*/
	struct head p_head;
	/*链表为空,链表指向下一项为空,说明链表为空*/
	p_head.root = NULL;
	
	/*像链表插入数据*/
	for(i = 0;i< 10;i++)
	{
		list_insert(&p_head,i);
	}
	
	/*遍历链表*/
	list_traverse(p_head.root);
	
	printf("main Exiting ...\n");
	return (0);
}

执行结果


用上面这个图片来表示链表就很简单了,我们后面还会看到循环链表,我们知道链表的尾部是指向NULL的,如果我们把后的那个链表指向head,就是循环链表。



分享好友

分享这个小栈给你的朋友们,一起进步吧。

Linux技术精选专区
创建时间:2020-07-08 10:30:23
Linux,全称GNU/Linux,是一套免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年次释出,它主要受到Minix和Unix思想的启发,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • dapan
    专家
戳我,来吐槽~