数据结构:动态创建单链表(C语言)

单链表的原理就不细述了,不懂的可以看一下其他文章或者教学视频。这里简单回顾一下原理:

简单来说类似于火车车厢连接,但又不同,因为火车车厢可以从当前车厢走到上一个或者下一个车厢,但单链表就是相当于火车只能从当前车厢走到下一个车厢,是无法从当前车厢走到上一节车厢的。

用c语言创建动态单链表的核心要点:

1.怎么构造单链表的基本单元?

用结构体定义一个单链表的单元,结构体里可以“储存”两个信息:一个是需要存储的数据,一个是指向下一个单元的地址,这样就简单构成了一个单链表的基本单元。

用中文表示就是:结构体{数据存储处;地址存储处}

2.怎么实现单链表“单向链接”的特性?

在地址存储处中放入下一个单元的地址,就可以实现单链表单向链接的特性。比如

结构体A{97;A001}(97是需存储数据,A001是下一个单元的地址)

结构体B{96;A002}(已知结构体B的内存地址为A001,那访问结构体A时,就可以找到B,同时B又存着C的内存地址,又可以找到C。。以此类推,如果定义了A、B、C、D、F单元,那就可以从A单元找到B单元,又从B单元找到C单元。。。一直找到F单元)

(如果不明白结构体的地址问题,我这里简单补充一下,C语言的结构体是一个特殊的存储单元,它可以由各种类型的变量组成,然后共用一个内存地址)

3.怎么实现动态单链表的创建?

首先要明白什么叫做动态创建单链表,就是我有一个数据时,我就创建一个“单元”把数据放进去。有5个数据,那就创5个单元。有7个数据,那就创建7个单元。而不是像静态链表一样,先创建好10个单元,我只能存10个以下的数据。

并且在创建过程中,我需要创建1000个单元的单链表,不再需要自己一个一个地定义单元,由循环自动完成。

如果要实现循环自动完成,那这个循环需要干这些事情:

第一:循环要自动定义一个单元,并且为这个单元分配内存地址

第二:将新创建的单元,自动地与上一个单元进行连接。
(这个步骤是动态创建单链表最核心的,也是最关键的,也从根本上体现了自动创建动态单链表的核心思想)

4.怎么自动地与上一个内存单元进行连接?我用中文直接把整个创建过程给写出来,应该读者会更好明白。

——————分割线——————————

第一步:创建头单元head,也就是单链表的第一个单元,并为其分配地址

第二步:创建普通节点单元s,并为其分配内存地址

第三步:将head与s手动相连。

第四步:定义一个辅助地址存储器z

第五步:将s地址存入z中

循环{

①创建新单元,并为新单元分配内存地址,将地址赋值给s;

②通过“指挥”z,将z代表的结构体单元的地址单元,赋值为新单元的地址,自此,新单元与上一个单元相连。(因为z里面存着s的地址,操作z相当于操作s)

③z赋值为新单元的地址,此时的z的地址已经不是第五步那个s的地址了!并且为此循环,z都会被刷新!存着上一个“新单元的地址”!

——————————分割线——————————

还不明白的读者可以直接看代码,或手动算一次过程!肯定会明白的!

代码如下:

#include
#include

/*写在前面:链表的创建其实就是一个不断申请内存单元,并将这些单元通过指针连接在一起的过程,这些单元在链表中称为节点*/ 

typedef struct Link{int data;struct Link *next;}node;  /*节点是通过结构体来定义的*/ 

/*上面这句这样排版更形象*/

node* creat_Link(int n);

int main(){

	node *head;
	
	head = creat_Link(5);	//创建长度为5的节点
	
	printf("%d",head);
	
}

node* creat_Link(int n){
	
	node *head;		//创建头节点指针,下一步是给头结点指针分配内存地址。
	
	head=(node*)malloc(sizeof(node)); //为头结点指针分配内存地址,(*node)是告诉程序要分配node类型指针
									//此时头结点创建完成 
										//创建好头节点以后,我们需要创建一个指向普通节点的指针							
	node *s;	 //创建指向普通节点的指针
	
	s=(node*)malloc(sizeof(node));
	
	head->next=s; 		//head指针域存s的地址 
	
	node *z;		//z临时保管s指向的地址值,没有这个后面for的时候s会被重新分配内存而刷新 
	
	z->next=s; 
	
	int i;	//循环计数器
		
	for(i=0;i<=n;i++){	//这个for用于循环创建节点,并将创建的节点插入到链表中,(插入本质上是对指针的连接 ) 
		
		s=(node*)malloc(sizeof(node));	//分配地址 
		
		z->next=s;
		
		z=s; 	
	} 	
	return head;		//返回头结点地址 
}

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