1、基本概念
链式存储结构不需要用地址连续的存储单元来实现,而是通过“链”建立起数据元素之间的顺序关系,因此它不要求两个在逻辑上相邻的数据元素在物理逻辑上也相邻。从而,在插入和删除元素的时候,不需要对原来的数据元素进行移动,只需要改变链表节点之间的指向关系即可,从而提升了运行时效率。
2、主要存储结构
链表的存储结构主要有单链表、循环链表、双向链表、静态链表等几种形式
3、基本实现
#include <string.h>
#include <malloc.h>
#include <stdio.h>
//数据结点类型
typedef struct Node {
DATA data;// DATA 为自定义类型
struct Node *next; // 指向下一个节点的指针
} ChainList;
// 将数据添加到链表尾部
ChainList *addEnd(ChainList *head, DATA data) {
ChainList *node;
ChainList *h;
// 分配内存空间,构造出链表节点
node = (ChainList *) malloc(sizeof(ChainList));
// 构造失败,返回空
if (!node)
return NULL;
node->data = data;
node->next = NULL;
// 错误的写法,虽然当前传入的是构造的空链表,但不能直接返回构造的节点
// if(head == NULL)
// return node ;
// 如果链表为空,即插入为头节点
if (head == NULL) {
head = node;
return head;
}
// 循环遍历至最后一个节点
h = head;
while (h->next) {
h = h->next;
}
// 建立节点之间的联系
h->next = node;
return head;
}
// 添加节点至头部
ChainList *addFirst(ChainList *head, DATA data) {
// 构造节点
ChainList *node = (ChainList *) malloc(sizeof(ChainList));
if (node == NULL) {
printf("申请内存失败");
return NULL;
}
node->data = data;
// 插入到头部
// 如果链表为空
if (head == NULL) {
head = node;
return head;
}
// 插入的节点变成了头节点
node->next = head;
head = node;
return head;
}
// 查找指定关键字的节点
ChainList *find(ChainList *head, char *key) {
ChainList *temp;
temp = head;
// 循环遍历链表,与关键字进行比较
while (temp) {
if (strcmp(temp->data.key, key) == 0)
return temp;
temp = temp->next;
}
// 没有匹配,返回空指针
return NULL;
}
// 在指定关键字之后插入元素
ChainList *insert(ChainList *head, char *key, DATA data) {
// 构造节点
ChainList *node = (ChainList *) malloc(sizeof(ChainList));
if (!node) {
printf("申请内存失败");
return NULL;
}
node->data = data;
// 查找要插入节点的位置
ChainList *node1;
node1 = find(head, key);
if (node1) {
node->next = node1->next;
node1->next = node;
} else {
// 没有找到要插入的位置,释放节点
free(node);
printf("未找到位置");
}
return head;
}
// 删除指定关键字的节点
int delete(ChainList *head, char *key) {
ChainList *temp, *node;
temp = node = head;
while (temp) {
if (strcmp(temp->data.key, key) == 0) {
node->next = temp->next;
free(temp);//释放内存
return 1;
} else {
// node 指向当前结点,temp 指向下一个节点
node = temp;
temp = temp->next;
}
}
// 删除失败
return 0;
}
// 返回链表的长度
int length(ChainList *head) {
ChainList *temp;
int count = 0;
temp = head;
while (temp) {
count++;
temp = temp->next;
}
return count;
}
本文介绍了链表的基本概念,包括其存储方式及优势,并详细展示了单链表的主要操作实现,如添加、查找、插入和删除节点等。
4593

被折叠的 条评论
为什么被折叠?



