概念
链式存储:结点在存储器中的位置是任意的,即逻辑相邻的数据元素在物理上不一定相邻
链式存储结构也称非顺序映像或链式映像
图解
链式存储结构中结点一般有两个部分组成,即数据域(data)和指针域,数据域是用于存放数据的,指针域是用来指向下一结点的地址的,其中头节点指向该链表的首元结点,表示该链表从这开始,尾结点的指针域是空的(NULL),当遇到空的指针域表示该链表到这个结点就已结束。
C语言实现
#include<stdio.h>
#include<stdlib.h>
//定义链表结构体
typedef struct link{
int data;
struct link* next;
}Link;
//初始化链表(生成长度4的链表并存放1,2,3,4)
Link* initLink() {
Link* head = NULL; //创建头指针
Link* a = (Link*)malloc(sizeof(Link)); //开辟一块内存空间给头结点
a->data = NULL;
a->next = NULL;
head = a; //头指针指向头结点
for (int i = 1; i < 5; i++) { //循环创建链表
Link* n = (Link*)malloc(sizeof(Link)); //开辟新内存空间给结点
n->data = i;
n->next = NULL;
a->next = n; //将结点的next指向下一结点
a = a->next;
}
return head; //返回链表首地址
}
//向链表中插入数据
void insertData(Link* p, int num, int data) {
Link* temp = p;
for (int i = 1; i < num; i++) { //判断插入的位置是否有效
temp = temp->next;
if (temp == NULL) {
printf("插入位置无效\n");
return;
}
}
Link* n = (Link*)malloc(sizeof(Link)); //创建新结点
n->data = data; //新结点的数据域赋值
n->next = temp->next; //新结点的指针域指向下一结点的地址
temp->next = n; //上一结点的指针域指向新结点
}
//向链表中删除数据
int delData(Link* p, int data) {
Link* temp = p;
Link* del = NULL;
int flag = 0;
while (temp->next) {
if (temp->next->data == data) {
flag = 1;
break;
}
temp = temp->next;
}
if (flag == 0) {
return -1;
}else {
del = temp->next;
temp->next = temp->next->next;
free(del);
return 1;
}
}
//打印链表元素
void displayLink(Link* p) {
p = p->next;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main() {
Link *p = initLink();
printf("初始化链表为:");
displayLink(p);
printf("插入元素后的链表为:");
insertData(p, 4, 6); //在链表中的第二个位置插入一个6
displayLink(p);
printf("删除元素后的链表为:");
delData(p, 6); //删除链表中数据域为2的结点
displayLink(p);
}
由于作者水平有限,如有错误请广大读者批评指正!