首页 > 其他分享 >数据结构-线性表的单链式存储结构图解及C语言实现

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

时间:2024-09-23 23:20:10浏览次数:3  
标签:结点 单链 线性表 temp next 链表 Link C语言 data

概念

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

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

图解

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

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

标签:结点,单链,线性表,temp,next,链表,Link,C语言,data
From: https://blog.csdn.net/m0_60984906/article/details/142467178

相关文章

  • 计算机二级C语言疑难
    1.strcpy函数在C语言中strcpy()函数会将字符串2(包括字符串结束字符/0)的函数覆盖到字符串1,如果字符串1没有足够的空间容纳字符串会导致缓冲溢出的错误例题:程序设计规定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:使字符串最前面连续的*号不得多于n个;若多于n个,则删......
  • 数据结构线性表两种方式分享
    第一种方式为老师说的数组+结构体(课本上),我用的是c++,其实与c没什么不同(区别:cin是scanf,cout是print,new是malloc()函数),我用的全局变量,所以不用传参。代码1:点击查看代码#include<iostream>#include<cstring>usingnamespacestd;constintN=1e4+5;structss{ charname[......
  • 20240923_212514 c语言 关系运算符
    ......
  • 20240923_202514 c语言 自增自减运算符
    演练加加顺序前件优先于后件++a,先自增,再使用值a++,先使用值,后自增多个数据夹在一起测测后果演练演练......
  • 20240910_021725 c语言 强制转换
    关于强转大转小就需要强转演练......
  • 20240910_031725 c语言 字符做加法
    ......
  • C语言之switch-case语句
    既然有了if、else组合为什么还需要switch、case组合呢?不要拿青龙偃月刀去削苹果那你既然有了菜刀为什么还需要水果刀呢?一把好刀是一个厨子的很重要的东西,而在做菜时不可能只有一把刀,有的刀适合切菜,有的刀适合剁肉,有的刀适合剔骨......if、else一般表示两个分支或是......
  • C语言中易混淆概念的关键字
    最快的关键字----registerregister:这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中而不是通过内存寻址访问以提高效率。注意是尽可能,不是绝对。你想想,一个CPU的寄存器也就那么几个或几十个,你要是定义了很多很多register变量,它累死也可能不能全部把这些变量......
  • 【C语言】动态内存管理
    目录一、为什么要动态内存分配二、malloc三、free四、calloc五、realloc六、常见动态内存分配的错误(1)解引用NULL指针(2)越界访问动态分配内存(3)用free释放非动态分配内存(4)用free释放动态分配内存的一部分(5)对同一块动态内存的多次释放(6)动态分配内存忘记释放(内存泄......
  • 数据结构--第二章 线性表
    注:根据严蔚敏等人的数据结构(C语言版)(第二版)记录,用于自己的复习记录。线性结构特点:除第一个元素无直接前驱,最后一个元素无直接后继外,其他每个数据元素都有一个前驱和一个后继。线性表的定义和特点线性表是最基本且最常用的一种线性结构。线性表:由()个数据特性相同的元素构成......