链表的定义及其简单解释

链表
1.存储方式:

(1)顺序存储:以连续的存储单元进行存储

(2)链式存储:存储单元不联系

2.链式存储:

(1)不可计算存储单元的地址,只能以存储的形式来完成

(2)结构:

①结点的结构:

数据域(data) 指针域(next)

②数据域:存储本结点的数据

③指针域:存放下一个结点的地址

④定义:

struct node{

	int data;

	struct node * next;

};

⑤类型重命名:

 a.  struct node{
    	int data;
    	struct node * next;
    };
    typedef stuct node ElemSN;
   



 b.   typedef struct node{
    	int data;
    	struct node * next;
    }ElemSN;

3.结点单元的分配:

(1)设类型名为:ElemSN

(2)ElemSN * p;

p=(ElemSN *)malloc(sizeof(ElemSN));

(3)引用成员:p->data,p->next;

4.链表的特点

5.术语:

(1)链表中相邻的两个结点分别称为前驱结点和后继结点,前驱结点的指针域存放其后继结点的

地址 前驱节点的指针域指向后继结点

(2)头结点:单向链表中没有前驱结点的结点

(3)尾结点:单向链表中没有后继结点的结点

6.线性链表的特点:

(1)有且仅有一个结点无前驱结点—头结点

(2)有且仅有一个结点无后继结点—尾结点

(3)除头、尾结点外,其余结点有且仅有一个前驱、后继

7.循环链表:尾结点的指针域指向头结点,即每一个结点都有它的前驱、后继

8.单向链表的创建、输出:

#include<stdio.h>
#include<stdlib.h>
#define N 10
typedef struct node {
	int data;
	struct node * next;
}ElemSN;
ElemSN * CreatLink(int arr[],int n);//创建链表
void PrintLink(ElemSN *head);//输出链表
int main(void){
	int arr[N];
	ElemSN * head;
	for(int i=0;i<N;arr[i]=i,++i);
	head = CreatLink(arr,N);
	PrintLink(head);
} 
ElemSN * CreatLink(int arr[],int n){
	ElemSN * p, * head, *tail;
	head=NULL;
	for(int i=0;i<n;i++){
		p=(ElemSN *)malloc(sizeof(ElemSN));
		p->data=arr[i];
		p->next=NULL;
		if(!head)	head=tail=p;
		else tail=tail->next=p;
	}
	return head;
}
void PrintLink(ElemSN * head){
	ElemSN * p;
	for(p=head;p;printf("%3d",p->data),p=p->next);
}
### C语言中链表定义和使用方法 #### 链表定义 链表是一种基本的数据结构,由一系列节点组成,每个节点包含一个值和指向下一个节点的指针[^3]。这种数据结构的主要特点是能够动态地添加和删除节点,而无需事先知道数据的具体数量。与数组相比,链表中的节点不必占用连续的存储空间,从而更灵活地利用内存资源。 #### 单链表的基本结构 以下是单链表的一个简单实现: ```c #include <stdio.h> #include <stdlib.h> // 定义链表节点结构 struct Node { int data; struct Node* next; }; ``` 在这里,`Node` 是一种结构体类型,其中 `data` 存储实际的数据,而 `next` 则是一个指向同一类型的另一个节点的指针[^2]。 #### 节点的操作 ##### 动态分配新节点 为了创建一个新的节点并初始化其值,可以编写如下函数: ```c // 创建新的节点 struct Node* create_node(int value) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); if (!newNode) { printf("Memory error\n"); exit(1); } newNode->data = value; newNode->next = NULL; return newNode; } ``` 此代码片段展示了如何通过 `malloc()` 函数来动态分配内存,并将其初始化为指定的数值[^4]。 ##### 头插法插入节点 头插法是在链表头部插入新节点的一种方式: ```c void insert_at_head(struct Node** head_ref, int new_data) { struct Node* new_node = create_node(new_data); new_node->next = *head_ref; *head_ref = new_node; } ``` 这段代码实现了在链表开头插入新节点的功能,使得每次插入后的新节点成为当前列表的第一个元素[^4]。 ##### 尾插法插入节点 尾插法则是在链表末尾追加新节点的方法之一: ```c void append(struct Node** head_ref, int new_data) { struct Node* new_node = create_node(new_data); if (*head_ref == NULL) { *head_ref = new_node; return; } struct Node* last = *head_ref; while (last->next != NULL) { last = last->next; } last->next = new_node; } ``` 该部分说明了当需要扩展链表时,在最后附加新节点的过程。 #### 输出整个链表的内容 遍历链表并将所有节点的信息打印出来也是常见的操作需求: ```c void print_list(struct Node* node) { while (node != NULL) { printf("%d ", node->data); node = node->next; } printf("\n"); } ``` 以上程序段用于逐一遍历链表中的每一个节点,并依次显示它们所保存的数据项[^1]。 #### 示例应用 下面给出完整的例子演示如何构建以及处理简单的整数型单向链接串列: ```c int main() { struct Node* head = NULL; // 插入几个测试用的项目到链表里去 append(&head, 6); insert_at_head(&head, 7); insert_at_head(&head, 1); // 打印最终形成的序列 print_list(head); return 0; } ``` 运行这个主函数将会得到预期的结果集:先加入的是数字6位于末端;接着再经由前导式置放机制先后安插进去两个较大的数值——先是7随后又是1,所以整体呈现出来的次序应该是 “1 -> 7 -> 6”。 ### 总结 综上所述,C语言中的链表不仅提供了强大的灵活性以适应各种复杂场景下的编程挑战,而且还能有效节省计算机内部宝贵的储存单元。掌握好它的基础理论知识及其具体实践技巧对于每一位学习者来说都是非常重要的一步。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值