自学内容网 自学内容网

数据结构-线性表的单链式存储结构图解及C语言实现

概念

链式存储:结点在存储器中的位置是任意的,即逻辑相邻的数据元素在物理上不一定相邻

链式存储结构也称非顺序映像或链式映像

图解

链式存储结构中结点一般有两个部分组成,即数据域(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);
} 

由于作者水平有限,如有错误请广大读者批评指正!


原文地址:https://blog.csdn.net/m0_60984906/article/details/142467178

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!