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;
}
相关推荐
李斯啦果23 分钟前
【PTA】L1-019 谁先倒
数据结构·算法
Mr Xu_16 小时前
告别硬编码:前端项目中配置驱动的实战优化指南
前端·javascript·数据结构
czxyvX16 小时前
017-AVL树(C++实现)
开发语言·数据结构·c++
数智工坊16 小时前
【数据结构-队列】3.2 队列的顺序-链式实现-双端队列
数据结构
elseif12316 小时前
【C++】并查集&家谱树
开发语言·数据结构·c++·算法·图论
徐小夕@趣谈前端17 小时前
Web文档的“Office时刻“:jitword共建版2.0发布!让浏览器变成本地生产力
前端·数据结构·vue.js·算法·开源·编辑器·es6
Nebula_g17 小时前
线程进阶: 无人机自动防空平台开发教程(更新)
java·开发语言·数据结构·学习·算法·无人机
xuxie9918 小时前
day 23 树
数据结构
EnglishJun19 小时前
数据结构的学习(四)---栈和队列
数据结构·学习
数智工坊20 小时前
【数据结构-特殊矩阵】3.5 特殊矩阵-压缩存储
数据结构·线性代数·矩阵