C链表入门

#include<stdio.h>
#include<stdlib.h>

//什么是链表?
//链表就是多个结构体连接在一起形成的聚合体
//要让多个结构链接在一起,并且可以记录数据,所以结构体可以构建如下

typedef struct NODE
{
	int value;           //为了存放数据
	struct NODE* next;   //为了能指向下一个相同的结构体
}node;

链表结构体构建完成之后就需要创建链表

int main(int argc, const int* argv[])
{
	node* head = NULL; //定义第一个链表中的结构体,因为现在链表里面什么都没有,所以是指向NULL
	int number;  //接下来要向链表之中插入数据
	do
	{
		scanf("%d", &number);
		node* p = (node*)malloc(sizeof(node));//设一个结构体来装这个number
		p->next = NULL;   //因为我们要把这个结构体放在链表最后面,所以这个结构体中的指针指向NULL
		p->value = number;
		if (head==NULL)  //如果head这时候是空的,也就是说这个链表什么都没有的时候,那么要让head等于p
		{
			head = p;
		}
		else
		{
			node* last = head;  //因为要把p放在链表最后,所以得找到最后一个结构,把p接在后面,所以这里设一个last
			while (last->next != NULL)
			{
				last = last->next;//先将last设置为第一个结点,当last中的next指向的节点存在的时候,last就是下一个节点
								  //循环结束后,last所指的结点就是最后一个节点,所以接下来要把p接在last后面
			}
			last->next = p;
		}
	} while (number!=-1);
}

之后将加入链表设置为一个函数:nodeadd,那么主函数如下:

我们想让nodeadd有这样的功能,给他一个数,再给他一个链表,他就可以把这个数加入这个链表,所以设置的两个函数为number和pnode,pnode下面讲;

int main(int argc, const int* argv[])
{
	node* head = NULL; //定义第一个链表中的结构体,因为现在链表里面什么都没有,所以是指向NULL
	int number;  //接下来要向链表之中插入数据
	do
	{
		scanf("%d", &number);
		nodeadd(number, pnode)
	} while (number!=-1);
}

因为如果传递的是一个node*head,那么会在nodeadd函数内有一个node*head的本地变量,对于主函数的head不会起作用,所以可以定义如下结构体

typedef struct Phead
{
	node* head;
	node* tral;
}phead;

其中,第一个node*head指向链表的头部方便我们找到这个链表,另一个node*tral指向链表尾部,方便我们给链表添加结点,那么主函数可以写成下面这样

int main(int argc, const int* argv[])
{
	phead pnode;
	pnode.head = pnode.tral = NULL;
	int number;  //接下来要向链表之中插入数据
	do
	{
		scanf("%d", &number);
		if (number!=-1)
		{
			nodeadd(number, &pnode);
		}
	} while (number != -1);
}

相对于上面的主函数,我们不再定义node*,而是定义phead,将phead传递过去,那么nodeadd可以写成下面这样

void nodeadd(int number, phead* pnode)
{
	node* p = (node*)malloc(sizeof(node));
	p->next = NULL;   
	p->value = number;
	if (pnode->head == NULL)  
	{
		pnode->head = p;    //如果第一个结点为空,那么第一个结点等于p
		pnode->tral = p;    //tral也等于p
	}
	else
	{
		node* last = pnode->tral;  
		last->next = p;
		pnode->tral = p;
	}
}

上面的代码就可以让我们新定义的结点连在之前结点的后面,下面要设置函数print来遍历我们的链表,我们希望我们所设置的函数是,我们给他一个phead的函数,他能给我们遍历出这个函数所指的链表中的所有函数,所以主函数如下;

int main(int argc, const int* argv[])
{
	phead pnode;
	pnode.head = pnode.tral = NULL;
	int number;  //接下来要向链表之中插入数据
	do
	{
		scanf("%d", &number);
		if (number!=-1)
		{
			nodeadd(number, &pnode);
		}
	} while (number != -1);
	print(pnode);
}

所以print函数如下

void print(phead pnode)
{
	for ( ; pnode.head ; pnode.head=pnode.head->next)
	{
		printf("%d\t", pnode.head->value);
	}
}

因为我们传递进去的不是一个指针,而是结构体,所以在print函数里改变head并不会改变主函数中的head,到此,我们完成了;链表的创建以及遍历,所有函数写在一起,如下:

#include<stdio.h>
#include<stdlib.h>

//什么是链表?
//链表就是多个结构体连接在一起形成的聚合体
//要让多个结构链接在一起,并且可以记录数据,所以结构体可以构建如下

typedef struct NODE
{
	int value;           //为了存放数据
	struct NODE* next;   //为了能指向下一个相同的结构体
}node;


typedef struct Phead
{
	node* head;
	node* tral;
}phead;

void nodeadd(int number, phead* pnode);
void print(phead pnode);

int main(int argc, const int* argv[])
{
	phead pnode;
	pnode.head = pnode.tral = NULL;
	int number;  //接下来要向链表之中插入数据
	do
	{
		scanf("%d", &number);
		if (number!=-1)
		{
			nodeadd(number, &pnode);
		}
	} while (number != -1);
	print(pnode);
	print(pnode);
}
void print(phead pnode)
{
	for ( ; pnode.head ; pnode.head=pnode.head->next)
	{
		printf("%d\t", pnode.head->value);
	}
}

void nodeadd(int number, phead* pnode)
{
	node* p = (node*)malloc(sizeof(node));
	p->next = NULL;   
	p->value = number;
	if (pnode->head == NULL)  
	{
		pnode->head = p;    //如果第一个结点为空,那么第一个结点等于p
		pnode->tral = p;    //tral也等于p
	}
	else
	{
		node* last = pnode->tral;  
		last->next = p;
		pnode->tral = p;
	}
}

注意:如果最后的print函数要传入指针的话,需要在print函数中新建一个node*以代替phead函数做遍历,否则就会改变phead函数,这里的话,因为结构体里面全是指针,所以我直接传的结构体。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值