链表之详解

一·静态链表
1.链表就是将很多个结构体串起来,连成一条链
通过指针来找到下一个结构体
就是让上一个结构体的指针指向下一个结构体,即这个指针装着下一个结构体的地址。

#include <stdio.h>
struct ren {
	char name[20];
	char sex[10];
	int age;
	struct ren* next;  //声明一个结构体指针
};
int main(void)
{
	struct ren a, b, c, d, e;
	struct ren* head;  //声明一个头指针
	struct ren* p;
	a.age = 10;
	strcpy(a.name, "长风");
	strcpy(a.sex, "男");
	b.age = 11;
	strcpy(b.name, "破浪");
	strcpy(b.sex, "女");
	c.age = 12;
	strcpy(c.name, "云帆");
	strcpy(c.sex, "男");
	d.age = 13;
	strcpy(d.name, "远影");
	strcpy(d.sex, "女");
	e.age = 13;
	strcpy(e.name, "碧空");
	strcpy(e.sex, "女");
	head = &a;   //头指针指向第一个结构体a
	a.next = &b;   // a中的指针指向下一个结构体b
	b.next = &c;   //之后同理
	c.next = &d;
	d.next = &e;
	e.next = NULL;
	p = head;
	while (p != NULL)
	{
		printf("%s  %s  %d \n", p->name, p->sex, p->age);
		p = p->next;
	}
}


二·动态链表
静态链表的缺点是定义的结点(结构体)数固定,在使用时可能定义的结点数不够,或太多而占用内存,所以就产生了动态链表。
动态链表可以在需要多少就建立多少

尾插法

先创建一个头结点,可以向其中放入数据,也可以不放人数据(这里讲不放入数据的)

struct student{
	int data;
	struct student *next;
};

//声明一个创建头结点的函数
struct student*creat_head(void)
{
	//为头结点申请一块空间
	struct student*Head = (struct student*)malloc(sizeof(struct student));
	//让头结点中的指针指向空
	Head->next = NULL;
	//返回这个头结点
	return Head;
}

然后就是增加链表的结点,写一个增加结点的函数

void add_node(struct student*Head,int data)
{
	//创建一个结点,初始指向头结点
	struct student* now = Head;
	//让这个结点每次都指向链表的最后一个结点,使得新建的结点能插在链表尾
	while(now->next != NULL)
	{
		now = now->next;
	}
	//为新结点申请内存
	struct student* p = (struct student*)malloc(sizeof(struct student));
	//为p结点数据赋值
	p->data = data;
	//让p结点中的指针指向空
	p->next = NULL;
	//让链表的尾结点中的指针指向新创建的结点,使得链表加长
	now->next = p;
}
//这个函数调用一次增加一个结点

可以使用循环增加

void add_node(struct student*Head,int data[]) // 可以传入数组
{
	//创建一个结点,初始指向头结点
	struct student* now = Head;
	//让这个结点每次都指向链表的最后一个结点,使得新建的结点能插在链表尾
	while(now->next != NULL)
	{
		now = now->next;
	}
	int i ;
	for(i = 0;i < 5;i++) // 创建五个结点
	//为新结点申请内存
	
	{
		struct student* p = (struct student*)malloc(sizeof(struct student));
		//为p结点数据赋值
		p->data = data[i];
		//让p结点中的指针指向空
		p->next = NULL;
		//让链表的尾结点中的指针指向新创建的结点,使得链表加长
		now->next = p;
		//*************************//
		//很重要的一步,让now指向p,这样就能循环了,now每次都是尾结点
		//,就可以接着指向新的创造的结点了,一直循环下去
		now = p;
	}
}

链表的遍历,利用while语句

int main(void)
{ 
	int data[5];
	int i;
	for(i = 0; i < 5;i++)
	{
		scanf("%d",&a[i]);
	}
	struct student*Head = creat_head();
	add_node(Head,data);
	struct student*p = Head->next // 因为我们的头结点中没有数据,所以我们让p指
	                              //指向头结点的下一个结点
	while(p != NULL)
	{
		printf("%d",p->data);
		p = p->next;  //让p指向p的下一个结点
	}
	return 0;
}


发布了13 篇原创文章 · 获赞 11 · 访问量 477

猜你喜欢

转载自blog.csdn.net/qq_45811966/article/details/103571458
今日推荐