数据结构:单链表实现信息管理

一、函数声明部分

cpp 复制代码
#ifndef __LINK_H__
#define __LINK_H__
#include <myhead.h>
typedef struct Link1
{
	union{
		int len;//用于头结点,统计节点个数
		int data;//用于正常节点,存储数据
	};
	struct Link1 *next;//指针域
}Link,*Plink;

/**********函数声明**********/
//1.创建头结点
Plink create();
//1.1头插法
int front_insert(Plink l, int m);
//1.2尾插法
int last_insert(Plink l, int m);
//2.输出
void output_link(Plink l);
//3.任意位置插入一个节点
void anywhere_insert(Plink l, int pos, int m);	
//4.任意位置删除一个节点
void anywhere_delete(Plink l, int pos);
//5.任意位置查找一个节点
void anywhere_search(Plink l, int pos); 
//6.任意位置修改一个节点
void anywhere_rebuild(Plink l, int pos, int m);

#endif

二、函数(功能)实现部分

1、创建头节点

cpp 复制代码
//创建头结点
Plink create()
{
	Plink p = malloc(sizeof(Link));
	if(p == NULL){
		printf("申请头结点失败!");
		return NULL;
	}
	p->len = 0;
	p->next = NULL;
	return p;
}

2、头插法插入节点

cpp 复制代码
//头插法
int front_insert(Plink l , int m)
{
	if(NULL == l){
		printf("单链表不存在!\n");
		return -1;
	}
	Plink p = malloc(sizeof(Link));
	p->data = m;//把数据存入新节点

	p->next = l->next; //新节点指向旧的第一个节点
	l->next = p; //头结点指向新节点
	
	l->len++; //节点个数+1
	return 0;
}

3、尾插法插入节点

cpp 复制代码
//尾插法
int last_insert(Plink l, int m)
{
	if(NULL == l){
		printf("单链表不存在!\n");
		return -1;
	}
	Plink t = l;
	for(int i=0; i<l->len; i++){
		t = t->next;
	}

	Plink p = malloc(sizeof(Link));
	p->data = m; //把数据存入新节点

	t->next = p; //最后一个节点指向新节点
	p->next = NULL; //新节点指向空

	l->len++; //节点个数+1
	return 0;
}

4、遍历输出

cpp 复制代码
//输出
void output_link(Plink l)
{
	Plink t = l;
	for(int i=0; i<l->len; i++){ //循环len次
		t = t->next;
		printf("%d\t",t->data); //数据域
	}
	printf("\n");
}	

5、任意位置插入一个节点

cpp 复制代码
//3.任意位置插入一个节点
void anywhere_insert(Plink l, int pos, int m)
{
	if(NULL == l || pos<1 || pos>l->len+1){
		printf("插入失败!\n");
		return;
	}
	Plink t = l;
	for(int i=1; i<pos; i++){
		t = t->next;
	}

	Plink p = malloc(sizeof(Link));
	p->data = m;

	p->next = t->next;
	t->next = p;

	l->len++;
}

6、任意位置删除一个节点

cpp 复制代码
//4.任意位置删除一个节点
void anywhere_delete(Plink l, int pos)
{
	if(NULL == l || pos<1 || pos>l->len){
		printf("不允许删除!\n");
		return;
	}
	Plink t = l;
	for(int i=1; i<pos; i++){
		t = t->next;
	}
	Plink q = t->next; //保留要删除的节点
	t->next = t->next->next; //删除链接
	l->len--;

	free(q); //删除后释放
	q = NULL; //置空
}

7、任意位置查找一个节点

cpp 复制代码
//5.任意位置查找一个节点
void anywhere_search(Plink l, int pos)
{
	if(NULL == l || pos<1 || pos>l->len){
		printf("查找失败!\n");
		return;
	}
	Plink t = l;
	for(int i=1; i<=pos; i++){
		t = t->next;
	}
	printf("第%d个节点的数据是:%d\n",pos, (t->data) );
}

8、任意位置修改一个节点

cpp 复制代码
//6.任意位置修改一个节点
void anywhere_rebuild(Plink l, int pos, int m)
{
	if(NULL==l || pos<1 || pos>l->len){
		printf("修改失败!\n");
		return;
	}
 
	Plink t = l;
	for(int i=1; i<=pos; i++){
		t = t->next;
	}

	t->data = m;
}

三、主函数部分

cpp 复制代码
#include"link.h"

int main(int argc, const char *argv[])
{
	int a[10]={0,1,2,3,4,5,6,7,8,9};
	//1.创建头结点
	Plink l = create();

	//1.1头插法
	for(int i=0; i<10; i++){
		front_insert(l, a[i]);
	}
	output_link(l);
	
	//1.2尾插法
	for(int i=0; i<10; i++){
		last_insert(l, a[i]);	
	}
	output_link(l);

	//3.任意位置插入一个节点
	anywhere_insert(l, 5, 666);
	output_link(l);

	//4.任意位置删除一个节点
	anywhere_delete(l, 8);
	output_link(l);

	//5.任意位置查找一个节点
	anywhere_search(l, 10);

	//6.任意位置修改一个节点
	anywhere_rebuild(l ,2, 999);
	output_link(l);
	
	free(l); //释放内存
	l = NULL; //置空
	return 0;
}
相关推荐
Logic10111 分钟前
C语言/数据结构贡献法题解:数组权值——所有连续子数组中不同数字个数之和(O(n)解法)
c语言·数据结构·算法·数组·时间复杂度·贡献法·哈希记录
DongQiShanRen12 分钟前
六根硬件映射(中):双站校验、生克闭环与驱动接口
数据库·人工智能·算法·rust·哈希算法·集成学习
mmmmath_325 分钟前
LeetCode.637.二叉树的层平均值
算法·leetcode
Code_Solitude28 分钟前
C语言分支结构练习题(华师版)
c语言·开发语言
青少儿编程课堂32 分钟前
蓝桥杯·全国青少年信息素养大赛·电子学会C/C++考级:并查集连通块与朋友圈问题解析
c++·python·算法·bfs·信息学竞赛
Tisfy39 分钟前
LeetCode 2913.子数组不同元素数目的平方和 I:第一题先常数很大的O(n^2)
算法·leetcode·题解·模拟·暴力
H.莓飛40 分钟前
【Linux】进程的创建与终止
linux·运维·服务器·c语言·visual studio
罗湖老棍子43 分钟前
[USACO05NOV] Asteroids G(洛谷-P7368)
算法·图论·二分图匹配·最大匹配·最小顶点覆盖
从小白到软工1 小时前
4-1 指针
c语言·开发语言·数据结构·经验分享·ai编程
AI技术新视界1 小时前
Harness^2:递归自进化智能体Harnessing框架
人工智能·深度学习·算法·harness·rsi