数据结构——基于单链表实现通讯管理系统

这篇具有很好参考价值的文章主要介绍了数据结构——基于单链表实现通讯管理系统。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前言

这个通讯录是基于单链表实现的,关于单链表,之前已经做过完整的实现方法——数据结构——单链表(C语言版)
用单链表实现的通讯录其实和用顺序表实现的通讯录类似,可以参考该文章——基于动态顺序表的应用——通讯录


完成该通讯录需要引进经过修改后的单链表的文件

SList.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include  "Contact.h"

typedef PeoInfo SLTDateType;

typedef struct SListNode
{
	SLTDateType date;
	struct SListNode* next;
}SLTNode;

//尾插
void SLTPushBack(SLTNode** pphead, SLTDateType x);

//头插
void SLTPushFront(SLTNode** pphead, SLTDateType x);

//尾删
void SLTPopBack(SLTNode** pphead);

//头删
void SLTPopFront(SLTNode** pphead);

//在指定位置之前插入数据
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDateType x);

//在指定位置之后插入数据
void SLTInsertAfter(SLTNode* pos, SLTDateType x);

//删除pos结点
void SLTErase(SLTNode** pphead, SLTNode* pos);

//删除pos之后的结点
void SLTEraseAfter(SLTNode* pos);

//销毁链表
void SListDesTroy(SLTNode** pphead);

SList.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "SList.h"

//申请新的结点
SLTNode* SLTBuyNode(SLTDateType x)
{
	SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
	if (newnode == NULL)
	{
		printf("malloc fail!");
		exit(1);
	}
	newnode->date = x;
	newnode->next = NULL;
	return newnode;
}

//尾插
void SLTPushBack(SLTNode** pphead, SLTDateType x)
{
	assert(pphead);
	SLTNode* newnode = SLTBuyNode(x);
	//空链表 和 非空链表
	if (*pphead == NULL)
	{
		*pphead = newnode;
	}
	else
	{
		SLTNode* ptail = *pphead;
		while (ptail->next)
		{
			ptail = ptail->next;
		}
		ptail->next = newnode;
	}
}

//头插
void SLTPushFront(SLTNode** pphead, SLTDateType x)
{
	assert(pphead);
	SLTNode* newnode = SLTBuyNode(x);
	newnode->next = *pphead;
	*pphead = newnode;
}

//尾删
void SLTPopBack(SLTNode** pphead)
{
	assert(pphead && *pphead);
	//只有一个结点
	if ((*pphead)->next == NULL)
	{
		free(*pphead);
		*pphead = NULL;
	}
	//多个结点
	else
	{
		SLTNode* prev = *pphead;
		SLTNode* ptail = *pphead;

		while (ptail->next)
		{
			prev = ptail;
			ptail = ptail->next;
		}
		free(ptail);
		ptail = NULL;
		prev->next = NULL;
	}
}

//头删
void SLTPopFront(SLTNode** pphead)
{
	assert(pphead && *pphead);
	SLTNode* next = (*pphead)->next;
	free(*pphead);
	*pphead = next;
}

//在指定位置之前插入数据
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDateType x)
{
	assert(pphead && *pphead);
	assert(pos);
	if (*pphead == pos)
	{
		SLTPushFront(pphead, x);
	}
	else
	{
		SLTNode* newnode = SLTBuyNode(x);
		SLTNode* prev = *pphead;
		while (prev->next != pos)
		{
			prev = prev->next;
		}
		prev->next = newnode;
		newnode->next = pos;
	}
	
}

//在指定位置之后插入数据
void SLTInsertAfter(SLTNode* pos, SLTDateType x)
{
	assert(pos);
	SLTNode* newnode = SLTBuyNode(x);
	newnode->next = pos->next;
	pos->next = newnode;
}

//删除pos结点
void SLTErase(SLTNode** pphead, SLTNode* pos)
{
	assert(pphead && *pphead);
	assert(pos);
	if (pos == *pphead)
	{
		SLTPopFront(pphead);
	}
	else
	{
		SLTNode* prev = *pphead;
		while (prev->next != pos)
		{
			prev = prev->next;
		}
		prev->next = pos->next;
		free(pos);
		pos = NULL;
	}
	
}

//删除pos之后的结点
void SLTEraseAfter(SLTNode* pos)
{
	assert(pos && pos->next);
	SLTNode* del = pos->next;
	pos->next = del->next;
	free(del);
	del = NULL;
}

//销毁链表
void SListDesTroy(SLTNode** pphead)
{
	assert(pphead && *pphead);
	SLTNode* pcur = *pphead;
	
	while (pcur)
	{
		SLTNode* next = pcur->next;
		free(pcur);
		pcur = next;
	}
	*pphead = NULL;
}

二、通讯录的实现

通讯录项目

创建一个通讯录项目,包含以下文件:

数据结构——基于单链表实现通讯管理系统,c语言,数据结构

Contact.h 通讯录的头文件,包含通讯录的声明以及相关函数的声明
Contact.c 通讯录函数的具体实现方法
contact.txt 保存通讯录中的数据

SList.h 单链表的声明
SList.c 单链表函数的声明

test.c 测试代码,也可以当菜单文章来源地址https://www.toymoban.com/news/detail-850746.html

Contact.h

#pragma once
#define NAME_MAX 100
#define SEX_MAX 4
#define TEL_MAX 11
#define ADDR_MAX 100

//联系人的数据
//姓名 性别 年龄 电话 地址
typedef struct PersonInfo
{
	char name[NAME_MAX];
	char sex[SEX_MAX];
	int age;
	char tel[TEL_MAX];
	char addr[ADDR_MAX];
}PeoInfo;

//前置声明
typedef struct SListNode contact;

//初始化通讯录
void InitContact(contact** con);

//添加通讯录数据
void AddContact(contact** con);

//删除通讯录数据
void DelContact(contact** con);

//展示通讯录数据
void ShowContact(contact* con);

//查找通讯录数据
void FindContact(contact* con);

//修改通讯录数据
void ModifyContact(contact** con);

//销毁通讯录数据
void DestroyContact(contact** con);

载入数据

//载入数据
void LoadContact(contact** con)
{
	FILE* pf = fopen("contact.txt", "r");
	//判断读取是否成功
	if (pf == NULL)
	{
		perror("fopen fail!");
		return;
	}
	//循环读取数据
	PeoInfo info;
	while (fread(&info, sizeof(PeoInfo), 1, pf))
	{
		SLTPushBack(con, info);
	}
	printf("历史数据导入通讯录成功!\n");
}

初始化通讯录

//初始化通讯录
void InitContact(contact** con)
{
	LoadContact(con);
}

添加通讯录数据

// 添加通讯录数据
void AddContact(contact** con)
{
	PeoInfo info;
	printf("请输入联系人的姓名:\n");
	scanf("%s", info.name);

	printf("请输入联系人的性别:\n");
	scanf("%s", info.sex);

	printf("请输入联系人的年龄:\n");
	scanf("%d", &info.age);

	printf("请输入联系人的电话:\n");
	scanf("%s", info.tel);

	printf("请输入联系人的地址:\n");
	scanf("%s", info.addr);

	SLTPushBack(con, info);
}

通过姓名查找联系人

//通过姓名查找联系人
contact* FindByName(contact* con, char name[])
{
	contact* pcur = con;
	while (pcur)
	{
		if (strcmp(pcur->date.name, name) == 0)
		{
			return pcur;
		}
		pcur = pcur->next;
	}
	return NULL;
}

删除通讯录数据

//删除通讯录数据
void DelContact(contact** con)
{
	char name[NAME_MAX];
	printf("请输入要删除的联系人的姓名->");
	scanf("%s", name);
	contact* pos = FindByName(*con, name);
	if (pos != NULL)
	{
		SLTErase(con, pos);
		printf("删除成功!\n");
	}
	else
	{
		printf("删除失败!没有该联系人!\n");
	}
}

展示通讯录数据

//展示通讯录数据
void ShowContact(contact* con)
{
	printf("%6s %6s %6s %6s %6s\n", "姓名", "性别", "年龄", "电话", "地址");
	contact* pcur = con;
	while (pcur)
	{
		printf("%6s %6s %6d %6s %6s\n",
			pcur->date.name,
			pcur->date.sex,
			pcur->date.age,
			pcur->date.tel,
			pcur->date.addr);
		pcur = pcur->next;
	}
}

查找通讯录数据

//查找通讯录数据
void FindContact(contact* con)
{
	char name[NAME_MAX];
	printf("请输入要查找的联系人的姓名->");
	scanf("%s", name);
	contact* pos = FindByName(con, name);
	if (pos == NULL)
	{
		printf("没有该联系人!\n");
	}
	else
	{
		printf("找到了!该联系人的信息如下:\n");
		printf("%6s %6s %6s %6s %6s\n", "姓名", "性别", "年龄", "电话", "地址");
		printf("%6s %6s %6d %6s %6s\n",
			pos->date.name,
			pos->date.sex,
			pos->date.age,
			pos->date.tel,
			pos->date.addr);
	}
}

修改通讯录数据

//修改通讯录数据
void ModifyContact(contact** con)
{
	char name[NAME_MAX];
	printf("请输入要修改的联系人的姓名->");
	scanf("%s", name);
	contact* pos = FindByName(*con, name);
	if (pos == NULL)
	{
		printf("没有该联系人!\n");
	}
	else
	{
		printf("开始修改!\n");
		printf("联系人的新姓名为:\n");
		scanf("%s", pos->date.name);

		printf("联系人的新性别为:\n");
		scanf("%s", pos->date.sex);

		printf("联系人的新年龄为:\n");
		scanf("%d", &pos->date.age);

		printf("联系人的新电话为:\n");
		scanf("%s", pos->date.tel);

		printf("联系人的新地址为:\n");
		scanf("%s", pos->date.addr);

		printf("修改成功!\n");
	}
}

保存通讯录

//保存通讯录
void SaveContact(contact* con)
{
	FILE* pf = fopen("contact.txt", "w");
	if (pf == NULL)
	{
		perror("fopen fail!");
		return;
	}
	//将通讯录数据写入文件
	contact* pcur = con;
	while (pcur)
	{
		fwrite(&(pcur->date), sizeof(pcur->date), 1, pf);
		pcur = pcur->next;
	}
	printf("通讯录保存成功!\n");
}

销毁通讯录数据

//销毁通讯录数据
void DestroyContact(contact** con)
{
	//在销毁通讯录之前,保存数据
	SaveContact(*con);
	SListDesTroy(con);
}

三、所有源代码

Contact.h

#pragma once
#define NAME_MAX 100
#define SEX_MAX 4
#define TEL_MAX 11
#define ADDR_MAX 100

//联系人的数据
//姓名 性别 年龄 电话 地址
typedef struct PersonInfo
{
	char name[NAME_MAX];
	char sex[SEX_MAX];
	int age;
	char tel[TEL_MAX];
	char addr[ADDR_MAX];
}PeoInfo;

//前置声明
typedef struct SListNode contact;

//初始化通讯录
void InitContact(contact** con);

//添加通讯录数据
void AddContact(contact** con);

//删除通讯录数据
void DelContact(contact** con);

//展示通讯录数据
void ShowContact(contact* con);

//查找通讯录数据
void FindContact(contact* con);

//修改通讯录数据
void ModifyContact(contact** con);

//销毁通讯录数据
void DestroyContact(contact** con);

Contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "Contact.h"
#include "SList.h"

//载入数据
void LoadContact(contact** con)
{
	FILE* pf = fopen("contact.txt", "r");
	//判断读取是否成功
	if (pf == NULL)
	{
		perror("fopen fail!");
		return;
	}
	//循环读取数据
	PeoInfo info;
	while (fread(&info, sizeof(PeoInfo), 1, pf))
	{
		SLTPushBack(con, info);
	}
	printf("历史数据导入通讯录成功!\n");
}

//初始化通讯录
void InitContact(contact** con)
{
	LoadContact(con);
}

// 添加通讯录数据
void AddContact(contact** con)
{
	PeoInfo info;
	printf("请输入联系人的姓名:\n");
	scanf("%s", info.name);

	printf("请输入联系人的性别:\n");
	scanf("%s", info.sex);

	printf("请输入联系人的年龄:\n");
	scanf("%d", &info.age);

	printf("请输入联系人的电话:\n");
	scanf("%s", info.tel);

	printf("请输入联系人的地址:\n");
	scanf("%s", info.addr);

	SLTPushBack(con, info);
}

//通过姓名查找联系人
contact* FindByName(contact* con, char name[])
{
	contact* pcur = con;
	while (pcur)
	{
		if (strcmp(pcur->date.name, name) == 0)
		{
			return pcur;
		}
		pcur = pcur->next;
	}
	return NULL;
}

//删除通讯录数据
void DelContact(contact** con)
{
	char name[NAME_MAX];
	printf("请输入要删除的联系人的姓名->");
	scanf("%s", name);
	contact* pos = FindByName(*con, name);
	if (pos != NULL)
	{
		SLTErase(con, pos);
		printf("删除成功!\n");
	}
	else
	{
		printf("删除失败!没有该联系人!\n");
	}
}

//展示通讯录数据
void ShowContact(contact* con)
{
	printf("%6s %6s %6s %6s %6s\n", "姓名", "性别", "年龄", "电话", "地址");
	contact* pcur = con;
	while (pcur)
	{
		printf("%6s %6s %6d %6s %6s\n",
			pcur->date.name,
			pcur->date.sex,
			pcur->date.age,
			pcur->date.tel,
			pcur->date.addr);
		pcur = pcur->next;
	}
}

//查找通讯录数据
void FindContact(contact* con)
{
	char name[NAME_MAX];
	printf("请输入要查找的联系人的姓名->");
	scanf("%s", name);
	contact* pos = FindByName(con, name);
	if (pos == NULL)
	{
		printf("没有该联系人!\n");
	}
	else
	{
		printf("找到了!该联系人的信息如下:\n");
		printf("%6s %6s %6s %6s %6s\n", "姓名", "性别", "年龄", "电话", "地址");
		printf("%6s %6s %6d %6s %6s\n",
			pos->date.name,
			pos->date.sex,
			pos->date.age,
			pos->date.tel,
			pos->date.addr);
	}
}

//修改通讯录数据
void ModifyContact(contact** con)
{
	char name[NAME_MAX];
	printf("请输入要修改的联系人的姓名->");
	scanf("%s", name);
	contact* pos = FindByName(*con, name);
	if (pos == NULL)
	{
		printf("没有该联系人!\n");
	}
	else
	{
		printf("开始修改!\n");
		printf("联系人的新姓名为:\n");
		scanf("%s", pos->date.name);

		printf("联系人的新性别为:\n");
		scanf("%s", pos->date.sex);

		printf("联系人的新年龄为:\n");
		scanf("%d", &pos->date.age);

		printf("联系人的新电话为:\n");
		scanf("%s", pos->date.tel);

		printf("联系人的新地址为:\n");
		scanf("%s", pos->date.addr);

		printf("修改成功!\n");
	}
}

//保存通讯录
void SaveContact(contact* con)
{
	FILE* pf = fopen("contact.txt", "w");
	if (pf == NULL)
	{
		perror("fopen fail!");
		return;
	}
	//将通讯录数据写入文件
	contact* pcur = con;
	while (pcur)
	{
		fwrite(&(pcur->date), sizeof(pcur->date), 1, pf);
		pcur = pcur->next;
	}
	printf("通讯录保存成功!\n");
}

//销毁通讯录数据
void DestroyContact(contact** con)
{
	//在销毁通讯录之前,保存数据
	SaveContact(*con);
	SListDesTroy(con);
}

SList.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include  "Contact.h"

typedef PeoInfo SLTDateType;

typedef struct SListNode
{
	SLTDateType date;
	struct SListNode* next;
}SLTNode;

//尾插
void SLTPushBack(SLTNode** pphead, SLTDateType x);

//头插
void SLTPushFront(SLTNode** pphead, SLTDateType x);

//尾删
void SLTPopBack(SLTNode** pphead);

//头删
void SLTPopFront(SLTNode** pphead);

//在指定位置之前插入数据
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDateType x);

//在指定位置之后插入数据
void SLTInsertAfter(SLTNode* pos, SLTDateType x);

//删除pos结点
void SLTErase(SLTNode** pphead, SLTNode* pos);

//删除pos之后的结点
void SLTEraseAfter(SLTNode* pos);

//销毁链表
void SListDesTroy(SLTNode** pphead);

SList.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "SList.h"



//申请新的结点
SLTNode* SLTBuyNode(SLTDateType x)
{
	SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
	if (newnode == NULL)
	{
		printf("malloc fail!");
		exit(1);
	}
	newnode->date = x;
	newnode->next = NULL;
	return newnode;
}

//尾插
void SLTPushBack(SLTNode** pphead, SLTDateType x)
{
	assert(pphead);
	SLTNode* newnode = SLTBuyNode(x);
	//空链表 和 非空链表
	if (*pphead == NULL)
	{
		*pphead = newnode;
	}
	else
	{
		SLTNode* ptail = *pphead;
		while (ptail->next)
		{
			ptail = ptail->next;
		}
		ptail->next = newnode;
	}
}

//头插
void SLTPushFront(SLTNode** pphead, SLTDateType x)
{
	assert(pphead);
	SLTNode* newnode = SLTBuyNode(x);
	newnode->next = *pphead;
	*pphead = newnode;
}

//尾删
void SLTPopBack(SLTNode** pphead)
{
	assert(pphead && *pphead);
	//只有一个结点
	if ((*pphead)->next == NULL)
	{
		free(*pphead);
		*pphead = NULL;
	}
	//多个结点
	else
	{
		SLTNode* prev = *pphead;
		SLTNode* ptail = *pphead;

		while (ptail->next)
		{
			prev = ptail;
			ptail = ptail->next;
		}
		free(ptail);
		ptail = NULL;
		prev->next = NULL;
	}
}

//头删
void SLTPopFront(SLTNode** pphead)
{
	assert(pphead && *pphead);
	SLTNode* next = (*pphead)->next;
	free(*pphead);
	*pphead = next;
}

//在指定位置之前插入数据
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDateType x)
{
	assert(pphead && *pphead);
	assert(pos);
	if (*pphead == pos)
	{
		SLTPushFront(pphead, x);
	}
	else
	{
		SLTNode* newnode = SLTBuyNode(x);
		SLTNode* prev = *pphead;
		while (prev->next != pos)
		{
			prev = prev->next;
		}
		prev->next = newnode;
		newnode->next = pos;
	}
	
}

//在指定位置之后插入数据
void SLTInsertAfter(SLTNode* pos, SLTDateType x)
{
	assert(pos);
	SLTNode* newnode = SLTBuyNode(x);
	newnode->next = pos->next;
	pos->next = newnode;
}

//删除pos结点
void SLTErase(SLTNode** pphead, SLTNode* pos)
{
	assert(pphead && *pphead);
	assert(pos);
	if (pos == *pphead)
	{
		SLTPopFront(pphead);
	}
	else
	{
		SLTNode* prev = *pphead;
		while (prev->next != pos)
		{
			prev = prev->next;
		}
		prev->next = pos->next;
		free(pos);
		pos = NULL;
	}
	
}

//删除pos之后的结点
void SLTEraseAfter(SLTNode* pos)
{
	assert(pos && pos->next);
	SLTNode* del = pos->next;
	pos->next = del->next;
	free(del);
	del = NULL;
}

//销毁链表
void SListDesTroy(SLTNode** pphead)
{
	assert(pphead && *pphead);
	SLTNode* pcur = *pphead;
	
	while (pcur)
	{
		SLTNode* next = pcur->next;
		free(pcur);
		pcur = next;
	}
	*pphead = NULL;
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "SList.h"
//测试代码——菜单
void menu()
{
	printf("****************通讯录*******************\n");
	printf("******1.添加联系人    2.删除联系人*******\n");
	printf("******3.修改联系人    4.查找联系人*******\n");
	printf("******5.展示联系人    0. 退出************\n");
	printf("*****************************************\n");
}

int main()
{
	int input = 0;
	contact* con = NULL;
	//初始化
	InitContact(&con);
	do
	{
		menu();
		printf("选择你的操作->");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			AddContact(&con);
			break;
		case 2:
			DelContact(&con);
			break;
		case 3:
			ModifyContact(&con);
			break;
		case 4:
			FindContact(con);
			break;
		case 5:
			ShowContact(con);
			break;
		case 0:
			printf("退出通讯录...\n");
			break;
		default:
			printf("输入错误!请重新输入!\n");
			break;
		}
	} while (input != 0);
	//销毁通讯录;
	DestroyContact(&con);
	return 0;
}

到了这里,关于数据结构——基于单链表实现通讯管理系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python数据结构实验设计(单链表):通讯录管理

    目录 摘要 一、课程设计目的及内容 创新功能: 二、算法及设计过程分析 1.总流程 2.主界面 3.文件处理与生成单链表 4.查看所有联系人信息 5.查看人数 6.查找联系人(以姓名或号码为依据) 7.对姓名或号码输入进行模糊查找  8.添加联系人 9.删除联系人  10.合并两个通

    2024年01月16日
    浏览(26)
  • 数据结构——基于顺序表实现通讯录

    1)⾄少能够存储100个⼈的通讯信息 2)能够保存⽤⼾信息:名字、性别、年龄、电话、地址等 3)增加联系⼈信息 4)删除指定联系⼈ 5)查找制定联系⼈ 6)修改指定联系⼈ 7)显⽰联系⼈信息 我们之前创建的顺序表可以实现连续存储数据(类型可以为整型、字符等),但无

    2024年02月05日
    浏览(33)
  • 数据结构--学生通讯录管理系统

    文章目录 一、问题描述 二、系统功能设计 三、各个代码部分 四、整体代码及其运行 五、总结 学生通讯录管理系统--C语言实现 在现实中,用学号和姓名来记录学生需要花费大量的纸质材料,并且出现容易丢失、查找困难等问题。 “学生通讯管理系统”是为了帮助老师、同

    2024年02月11日
    浏览(38)
  • 【数据结构】单链表完整代码实现

    前置文章:顺序表的代码实现 每个结点除了存放数据元素外,还要存储指向下一个结点的指针。 不要求大片连续空间 改变容量方便 不可随机存取 要耗费一定空间存放指针 代码结构: 定义单链表结构 初始化单链表 单链表的取值方法 单链表的查找方法 单链表的插入方法 单

    2024年02月07日
    浏览(26)
  • 【数据结构——队列的实现(单链表)】

    1.出入队列的方式:队尾进入,对首出队列。 2.出队列和入队列的关系是:一对一的。

    2024年02月04日
    浏览(32)
  • 【数据结构】单链表的实现

    🌇个人主页:平凡的小苏 📚学习格言:别人可以拷贝我的模式,但不能拷贝我不断往前的激情 🛸C语言专栏:https://blog.csdn.net/vhhhbb/category_12174730.html 🚀数据结构专栏:https://blog.csdn.net/vhhhbb/category_12211053.html         家人们更新不易,你们的👍点赞👍和⭐关注⭐真的对我

    2023年04月09日
    浏览(34)
  • 【数据结构】-- 单链表的实现

    在前面我们学习了顺序表,顺序表在数组的基础上提供了很多现成的方法,方便了我们对数据的管理,但是我们也发现顺序表有着许多不足: 在处理大型的数据时,需要频繁的增容且在中间删除或插入数据时需要遍历顺序表,这些性质导致了顺序表的 效率较低 。这时我们就

    2024年04月27日
    浏览(30)
  • 【(数据结构)— 单链表的实现】

    概念: 链表是⼀种 物理存储结构上非连续、 非顺序的存储结构,数据元素的 逻辑顺序 是通过链表中的 指针链接 次序实现的 。 链表的结构跟⽕⻋⻋厢相似,淡季时⻋次的⻋厢会相应减少,旺季时⻋次的⻋厢会额外增加⼏节。只需要将⽕⻋⾥的某节⻋厢去掉/加上,不会影响

    2024年02月08日
    浏览(31)
  • 数据结构之单链表及其实现!

    目录 ​编辑 1.  顺序表的问题及思考 2.链表的概念结构和分类 2.1 概念及结构 2.2 分类 3. 单链表的实现 3.1 新节点的创建 3.2 打印单链表 3.3 头插 3.4 头删 3.5 尾插 3.6 尾删 3.7 查找元素X 3.8 在pos位置修改 3.9 在任意位置之前插入 3.10 在任意位置删除 3.11 单链表的销毁 4. 完整代码

    2024年03月12日
    浏览(48)
  • 【数据结构—单链表的实现】

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 1. 链表的概念及结构 2. 单链表的实现 2.1单链表头文件——功能函数的定义 2.2单链表源文件——功能函数的实现 2.3 单链表源文件——功能的测试 3.具体的理解操作图 4. 链表的分类 总结 世上

    2024年02月05日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包