数据结构-线性表的单链式存储结构图解及C语言实现
概念
链式存储:结点在存储器中的位置是任意的,即逻辑相邻的数据元素在物理上不一定相邻
链式存储结构也称非顺序映像或链式映像
图解
链式存储结构中结点一般有两个部分组成,即数据域(data)和指针域,数据域是用于存放数据的,指针域是用来指向下一结点的地址的,其中头节点指向该链表的首元结点,表示该链表从这开始,尾结点的指针域是空的(NULL),当遇到空的指针域表示该链表到这个结点就已结束。
C语言实现
#include<stdio.h>
#include<stdlib.h>
//定义链表结构体
typedef struct Link{
int data;
struct Link* next;
}Link;
//初始化链表
Link* initLink() {
Link* head = (Link*)malloc(sizeof(Link)); //创建头结点
Link* temp = head; //临时结点
head->data = NULL; //头结点数据域为空
head->next = NULL; //头结点指针域为空
for (int i = 1; i < 5; i++) {
Link* n = (Link*)malloc(sizeof(Link)); //创建新结点
n->data = i; //新结点数据域赋值
n->next = temp->next; //新结点指针域为上一结点的指针域
temp->next = n; //上一结点的指针域为新结点
temp = temp->next; //temp指向新结点
}
return head; //返回链表头结点
}
//添加链表结点(在链表p中的第num个位置添加一个data)
void insertLink(Link* p, int num, int data) {
Link* temp = p; //临时结点
for (int i = 1; i < num; i++) {
temp = temp->next;
} //temp指向第num个结点的上一结点
if (temp == NULL) {
printf("位置不合法\n");
return;
} //如果这个结点是空的表示不合法
Link* n = (Link*)malloc(sizeof(Link)); //创建新结点n
n->data = data; //新结点的数据域赋值
n->next = temp->next; //新结点的指针域指向上一结点的指针域
temp->next = n; //上一结点的指针域指向新结点
}
//按值删除链表结点
void delLink(Link* p,int delData) {
Link* temp = p;
int flag = 0;
while (temp->next) {
if (temp->next->data == delData) {
flag = 1;
break;
}
temp = temp->next;
}
if (flag == 1) {
Link* del = temp->next;
del->data = NULL;
temp->next = del->next;
del->next = NULL;
free(del);
}
else {
printf("无该元素\n");
return;
}
}
//更改结点元素
void changeLink(Link* p, int num, int data) {
Link* temp = p->next;
for (int i = 1; i < num; i++) {
temp = temp->next;
}
if (temp != NULL) {
temp->data = data;
}
else {
printf("位置不合法\n");
return;
}
}
//按值查找元素位置
int selectLink(Link* p, int selectData) {
Link* temp = p;
int flag = 0;
while (temp->next && temp->next != NULL) {
if (temp->next->data == selectData) {
return flag+1;
}
flag++;
temp = temp->next;
}
printf("未找到元素");
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();
displayLink(p);
insertLink(p ,3 ,7);
displayLink(p);
delLink(p, 1);
displayLink(p);
changeLink(p, 1, 9);
displayLink(p);
printf("%d", selectLink(p, 5));
}
由于作者水平有限,如有错误请广大读者批评指正!