数据结构:2.链式表

几乎全是代码,概念配合代码,可以多打几遍熟练

缺的地方后续会补

目录

1.链表分类

2.单向链表

3.双向链表

4.循环链表


1.链表分类

  • 单向链表
  • 双向链表
  • 循环链表

2.单向链表

  • 单向链表又分有头链表和无头链表
  • 有头链表(又称带头节点的链表)是在链表的第一个元素之前增加一个特殊的"头节点",这个节点不存储实际数据,只作为链表的入口
  • 无头链表是指链表的第一个节点就是实际存储数据的节点,没有额外的头节点
  • 由于无头链表要用到大量二级指针,过于麻烦,有头链表更为常用
  • 多文件编程makefile

makefile

cs 复制代码
mu:=main
lai+=lian.c
lai+=main.c
$(mu):$(lai)
    gcc $^ -g -o $@                                                         

.PHONY:
clean:
    rm $(mu)

下为单向链表的创建,插入值(头插),打印,删除值,寻找值,修改值,插入值(尾插),lian.c文件

cs 复制代码
#include"lian.h"
Node_t *chuanglian(void)
{
	Node_t *pnewnode = NULL;
	pnewnode = malloc(sizeof(Node_t));
	if(NULL == pnewnode)
	{
		perror("失败");
		return NULL;
	}
	pnewnode->pnext = NULL;

	return pnewnode;
}
int chalian(Node_t *ptou,datatype data)
{
	Node_t *pnewnode = NULL;
	pnewnode = malloc(sizeof(Node_t));
	if(NULL == pnewnode)
	{
		perror("失败");
		return -1;
	}
	pnewnode->data = data;
	pnewnode->pnext = ptou->pnext;
	ptou->pnext = pnewnode;
	return 0;
}
void showlian(Node_t *ptou)
{
	Node_t * pzhong = NULL;
	pzhong = ptou->pnext;
	while(pzhong != NULL)
	{
		printf("%d ",pzhong->data);
		pzhong = pzhong->pnext;
	}
	putchar('\n');
}
int shanlian(Node_t *ptou,datatype a)
{
	int cnt = 0;
	Node_t *pqian = NULL;
	Node_t *phou = NULL;
	pqian = ptou->pnext;
	phou = ptou;
	while(pqian != NULL)
	{
		if(pqian->data == a)
		{
			phou->pnext = pqian->pnext;
			free(pqian);
			pqian = phou->pnext; 
			cnt++;
		}
		else
		{
			pqian = pqian->pnext;
			phou = phou->pnext;
		}
	}
	return cnt;
}
Node_t * zhaolian(Node_t *ptou,datatype a)
{
	Node_t *pzhong = NULL;
	Node_t *pfu = NULL;
	pzhong = ptou->pnext;
	while(pzhong != NULL)
	{
		if(a == pzhong->data)
		{
			pfu = pzhong;
			return pfu;
		}
		pzhong = pzhong->pnext;
	}
	return NULL;
}
int gailian(Node_t *ptou,datatype jiu,datatype xin)
{
	int cnt = 0;
	Node_t *pzhong = NULL;
	pzhong = ptou->pnext;
	while(pzhong != NULL)
	{
		if(pzhong->data==jiu)
		{
			pzhong->data = xin;
			cnt++;
		}
		pzhong = pzhong->pnext;
	}
	return cnt;
}
int weichalian(Node_t *ptou,datatype data)
{
	Node_t *pnewnode = NULL;
	Node_t *pzhong = ptou;
	pnewnode = malloc(sizeof(Node_t));
	if(NULL == pnewnode)
	{
		perror("失败");
		return -1;
	}
	pnewnode->data = data;
	while(pzhong->pnext != NULL)
	{
		pzhong=pzhong->pnext;
	}
	pnewnode->pnext = pzhong->pnext;
	pzhong->pnext = pnewnode;
	return 0;
}

main.c文件

cs 复制代码
#include"lian.h"
int main()
{
	Node_t *plian = NULL;
	plian = chuanglian();
	chalian(plian,1);
	chalian(plian,2);
	chalian(plian,3);
	chalian(plian,3);
	chalian(plian,4);
	chalian(plian,2);
	chalian(plian,5);
	printf("头插:1、2、3、3、4、2、5\n");
	showlian(plian);
	int a=shanlian(plian,3);
	printf("删了%d个3\n",a);
	showlian(plian);
	Node_t *fu = zhaolian(plian,4);
	printf("找4:%p %d \n",fu,fu->data);
	int b=gailian(plian,2,9);
	printf("9换2:");
	showlian(plian);
	weichalian(plian,0);
	weichalian(plian,1);
	weichalian(plian,2);
	weichalian(plian,3);
	weichalian(plian,4);
	weichalian(plian,5);
	printf("尾插:0、1、2、3、4、5\n");
	showlian(plian);
	return 0;
}

lian.h文件

cs 复制代码
#ifndef __LINKLIST_H__
#define __LINKLIST_H__
#include<stdio.h>
#include<stdlib.h>
typedef int datatype;
typedef struct node
{
	datatype data;
	struct node *pnext;
}Node_t;
extern Node_t *chuanglian(void);
extern int chalian(Node_t *ptou,datatype data);
extern void showlian(Node_t *ptou);
extern int shanlian(Node_t *ptou,datatype a);
extern Node_t *zhaolian(Node_t *ptou,datatype a);
extern int gailian(Node_t *ptou,datatype jiu,datatype xin);
extern int weichalian(Node_t *ptou,datatype data);
#endif

3.双向链表

4.循环链表

相关推荐
一个爱编程的人2 小时前
一个数是不是素数
数据结构·算法
忡黑梨2 小时前
eNSP_从直连到BGP全网互通
c语言·网络·数据结构·python·算法·网络安全
地球资源数据云3 小时前
1900-2023年中国物种分布点位矢量数据集
大数据·数据结构·数据库·数据仓库·人工智能
AI人工智能+电脑小能手3 小时前
【大白话说Java面试题】【Java基础篇】第20题:HashMap在计算index的时候,为什么要对数组长度做减1操作
java·开发语言·数据结构·后端·面试·哈希算法·hash-index
牢姐与蒯3 小时前
cpp数据结构之map
数据结构
故事和你913 小时前
洛谷-算法2-3-分治与倍增5
开发语言·数据结构·c++·算法·动态规划·图论
北顾笙9804 小时前
day37-数据结构力扣
数据结构·算法·leetcode
liuyao_xianhui5 小时前
进程概念与进程状态_Linux
linux·运维·服务器·数据结构·c++·哈希算法·宽度优先
如君愿5 小时前
考研复习 Day 26 | 习题--计算机网络第三章(数据链路层 下)、数据结构 多维数组与广义表
数据结构·计算机网络·考研·记录考研
bqq198610265 小时前
MySQL分库分表
数据结构·mysql