Day 1.数据结构----单向链表(无头单向链表)

数据结构

如何组织存储数据

程序 = 数据结构 + 算法

MVC:软件设计结构

M:数据的管理(数据结构)

V:视图,数据的反映及人机交互

C:逻辑控制

单向链表

有头链表:第一个链表结点中不存储有效数据

无头链表:第一个链表结点中存储有效数据

需掌握的七大操作

初始化链表

复制代码
typedef int DATA_TYPE;    //将整形重命名

/* 链表的结点类型 */
typedef struct node
{
	DATA_TYPE data;   //数据域
	struct node *pnext;   //指针域
}LINK_NODE;

/* 描述链表属性的标签的类型 */
typedef struct list
{
	LINK_NODE *phead;   //存放头结点的地址
	int clen;   //结点个数
}LINK_LIST;

建立一个空链表

复制代码
LINK_LIST *create_linked(void)
{
	LINK_LIST *plist = NULL;

	plist = malloc(sizeof(LINK_LIST));  //创建一个链表标签的空间
	if (NULL == plist)
	{
		perror("fail to malloc");
		return NULL;
	}

	plist->phead = NULL;     //标签指针域所指向的头结点的地址为空
	plist->clen = 0;         //标签含有的节点个数为0;

	return plist;
}

链表的头插

复制代码
int Insert_Linked_List(LINK_LIST *plist, DATA_TYPE data)
{
	LINK_NODE *pnode = NULL;

	pnode = malloc(sizeof(LINK_NODE));  //创建一个新结点的空间
	if (NULL == pnode)
	{
		perror("fail to malloc");
		return -1;
	}

	pnode->data = data;      //给新结点的数据域赋值
	pnode->pnext = NULL;     //给新结点的指针域指向为空,成为尾结点

	pnode->pnext = plist->phead;    //将头结点的地址放到新创建的结点的指针域中
	plist->phead = pnode;    //将新创建的结点的地址放到标签的指针域中

	plist->clen++;   //标签的结点数自增

	return 0;

}

遍历打印

复制代码
int Ergodic_Linkde_List(LINK_LIST *plist)
{
	LINK_NODE *pmt = NULL;  //定义一个指向每一个结点的指针

	pmt = plist->phead;         //指向头结点
	while (pmt != NULL)
	{
		printf("%d\n", pmt->data);      //打印指针指向结点的
		pmt = pmt->pnext;                //将每个结点的指针域的内容赋值给这个指针
	}

	return 0;
}

判断是否位空链表

复制代码
int is_empty_link(LINK_LIST *plist)
{
	return NULL == plist->phead;
}

链表的尾插

复制代码
int Tail_Plug_List(LINK_LIST *plist, DATA_TYPE data)
{
	LINK_NODE *pnode = NULL;
	LINK_NODE *ptme = NULL;

	pnode = malloc(sizeof(LINK_NODE));
	if (NULL == pnode)
	{
		perror("fail to malloc");
		return -1;
	}

	pnode->data = data;
	pnode->pnext = NULL;

	if (is_empty_link(plist))    //链表为空直接在后面插入
	{
		plist->phead = pnode;
		plist->clen++;
		return 0;
	}

	ptme = plist->phead;	        //链表非空
	while(ptme->pnext != NULL)      //找到尾链表在以次插入
	{
		ptme = ptme->pnext;
	}

	ptme->pnext = pnode;
	plist->clen++;

	return 0;
}

链表的尾删

复制代码
int Tail_Deletion_List(LINK_LIST *plist)
{
	LINK_NODE *ptme = NULL;

	if (is_empty_link(plist))       //为空链表时
	{
		return 0;
	}	
	else if(1 == plist->clen)           //只有一个结点时
	{
		free(plist->phead);
		plist->phead = NULL;
	}
	else                                //一个以上结点时
	{
		ptme = plist->phead;
		while(ptme->pnext->pnext != NULL)    
		{
			ptme = ptme->pnext;          //指针指到尾结点的前驱结点
		}

		free(ptme->pnext);           
		ptme->pnext = NULL;
	}

	plist->clen--;

	return 0;
}

链表的头删

复制代码
int Head_Delete(LINK_LIST *plist)
{
	LINK_NODE *ptme = NULL;

	if (is_empty_link(plist))     //空链表不用删除
	{
		return 0;
	}
	else if (1 == plist->clen)    //只有一个结点时,直接删除
	{
		free(plist->phead);
		plist->phead = NULL;
	}
	else                               //不止一个结点
	{
		ptme = plist->phead->pnext;       //将第二个结点的地址存起来
		free(plist->phead);				  //free掉第一个
		plist->phead = ptme;              //将第二个结点的地址放到标签中
	}

	plist->clen--;               //个数--

	return 0;
}
相关推荐
历程里程碑12 分钟前
Linux20 : IO
linux·c语言·开发语言·数据结构·c++·算法
DeeplyMind25 分钟前
第七章:数据结构大比拼
数据结构·计算机科学·少儿编程·少儿科技读物
元亓亓亓26 分钟前
考研408--数据结构--day8--遍历序列&线索二叉树
数据结构·考研·408·线索二叉树
xiaoxue..32 分钟前
合并两个升序链表 与 合并k个升序链表
java·javascript·数据结构·链表·面试
驭渊的小故事1 小时前
简单模板笔记
数据结构·笔记·算法
VT.馒头2 小时前
【力扣】2727. 判断对象是否为空
javascript·数据结构·算法·leetcode·职场和发展
历程里程碑3 小时前
Linux 库
java·linux·运维·服务器·数据结构·c++·算法
Sheep Shaun3 小时前
如何让一个进程诞生、工作、终止并等待回收?——探索Linux进程控制与Shell的诞生
linux·服务器·数据结构·c++·算法·shell·进程控制
Pluchon3 小时前
硅基计划4.0 简单模拟实现AVL树&红黑树
java·数据结构·算法
小龙报4 小时前
【51单片机】从 0 到 1 玩转 51 蜂鸣器:分清有源无源,轻松驱动它奏响新年旋律
c语言·数据结构·c++·stm32·单片机·嵌入式硬件·51单片机