当前位置: 首页 > article >正文

数据结构-线性表的单链式存储结构图解及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));
} 

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


http://www.kler.cn/a/321851.html

相关文章:

  • 使用热冻结数据层生命周期优化在 Elastic Cloud 中存储日志的成本
  • Python学习26天
  • 【LeetCode】每日一题 2024_11_14 统计好节点的数目(图/树的 DFS)
  • 越南很火的slots游戏投放Google谷歌广告策略
  • 会话信息处理: HttpSession、token序列化、收集登录设备信息、基于`spring-session-data-redis`实现session共享。
  • SQL,力扣题目1127, 用户购买平台
  • 都说网络安全缺口那么大,但为何招聘数量却不多?总算明白了!
  • Linux系统部署Mysql8.x修改密码并且设置远程连接
  • UniApp基于xe-upload实现文件上传组件
  • electron的常用弹窗简单案例
  • 15年408-数据结构
  • 老人跌倒扶不扶?涪城三职工给出响亮答案
  • 【docker】在IDEA工具内,远程操作服务器上的docker
  • Rust Web开发常用库
  • Leetcode 706. 设计哈希映射
  • 大屏可视化px转rem方案实现
  • webservice cxf框架 jaxrs jaxws spring整合 接口测试方法 wsdl报文详解 springboot整合 拦截器 复杂参数类型
  • 作者分享|eDNA研究梯级水坝对浮游植物和浮游动物群落变化的影响
  • WPF入门教学十九 属性动画与时间线
  • 计算机网络nat 映射案列
  • 基于nodejs+vue的校园二手物品交易系统
  • Vue3+Vite中引用Swiper11自动轮播、左右切换不生效,已解决
  • Android常用C++特性之std::equal
  • 【python append函数的一些细节】
  • 音频转MP3格式困难?如何轻松实现wav转mp3?
  • Vue3中el-table组件实现分页,多选以及回显