概念
链式存储:结点在存储器中的位置是任意的,即逻辑相邻的数据元素在物理上不一定相邻
链式存储结构也称非顺序映像或链式映像
图解
链式存储结构中结点一般有两个部分组成,即数据域(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); //在链表中的第二个位置插入一个6displayLink(p);printf("删除元素后的链表为:");delData(p, 6); //删除链表中数据域为2的结点displayLink(p);
}
由于作者水平有限,如有错误请广大读者批评指正!