数据结构--链表(单链表)的创建及C语言实现

1.逻辑结构上一个挨一个的数据,在实际存储时,并没有像顺序表那样也相互紧挨着。恰恰相反,数据随机分布在内存中的各个位置,这种存储结构称为线性表的链式存储。

由于分散存储,为了能够体现出数据元素之间的逻辑关系,每个数据元素在存储的同时,要配备一个指针,用于指向它的直接后继元素,即每一个数据元素都指向下一个数据元素(最后一个指向NULL(空))。

2.

3.链表中存放的不是基本数据类型,需要用结构体实现自定义:

typedef struct Link {
	char elem;  //代表数据域
	struct Link * next; //代表指针域,指向直接后继元素
}Link;

4.头结点、头指针和首元结点

头结点:有时,在链表的第一个结点之前会额外增设一个结点,结点的数据域一般不存放数据(有些情况下也可以存放链表的长度等信息),此结点被称为头结点。

若头结点的指针域为空(NULL),表明链表是空表。头结点对于链表来说,不是必须的,在处理某些问题时,给链表添加头结点会使问题变得简单。

首元结点:链表中第一个元素所在的结点,它是头结点后边的第一个结点。

头指针:永远指向链表中第一个结点的位置(如果链表有头结点,头指针指向头结点;否则,头指针指向首元结点)。

头结点和头指针的区别:头指针是一个指针,头指针指向链表的头结点或者首元结点;头结点是一个实际存在的结点,它包含有数据域和指针域。两者在程序中的直接体现就是:头指针只声明而没有分配存储空间,头结点进行了声明并分配了一个结点的实际物理内存。

5.创建一个链表(1,2,3,4):

#include <stdio.h>
#include <stdlib.h>
//结构体实现自定义:
typedef struct Link {
	int elem;//代表数据域
	struct Link *next;//代表指针域,指向直接后记元素
	
}link;
//初始化链表
//link * initLink();
link * initLink() {
	link * p = (link*)malloc(sizeof(link));
	link * temp = p;//声明一个指针指向头节点
	//生成链表
	for (int i = 1; i < 5; i++) {
		link *a = (link*)malloc(sizeof(link));
		a->elem = i;
		a->next = NULL;
		temp->next = a;
		temp = temp->next;
	}
	
	return p;
}
 
//void display(link *p);
void display(link *p) {
	link* temp = p;//将temp指针重新指向头结点
	//只要temp指针指向的结点的next不是Null,就执行输出语句。
	while (temp->next) {
		temp = temp->next;
		printf("%d", temp->elem);
	}
	printf("\n");
}

int main() {
	//初始化链表(1,2,3,4)
	printf("初始化链表为:\n");
	link *p = initLink();
	display(p);

}

结果:

猜你喜欢

转载自blog.csdn.net/huanhuan59/article/details/84072632