数据结构
本系列是C语言学完的基础上,对数据结构的一些练习,代码偏多。
注意啦:每日一看
数据结构:
1.逻辑结构(关系)线性结构:**线性表** 栈 队列 非线性结构: 树 图
2.存储结构:
顺序存储 **链式存储**
注意啦:以下是本人介绍哦
📕作者简介:S学长,致力于C/C++、嵌入式。从事嵌入式行业,热爱健身,身体倍棒的一位博主。
📗本文收录于爱上Linux系列,大家有兴趣的可以看一看
📘相关专栏C语言嵌入式开发、C语言入门系列等,日常Bug集期待你的指导。
📙S学长爱上Linux系列正在发展中,喜欢嵌入式的朋友们可以关注一下哦!
单项链表核心讲解
1.1单向链表结构
对照上面结构定义数据
1.2功能函数
1>插入函数
单向链表向后插入,如图所示:
2>删除函数
单向链表删除某个结点时,以前一个结点为基准进行删除
具体代码
2.1 头文件 linklist.h
#pragma once
#ifndef _LINKLIST_
#define _LINKLIST_
#define Max_Name 20
#define Max_Sex 5
#define Max_Tele 15
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct person {
char name[Max_Name];
char sex[Max_Sex];
int age;
char tele[Max_Tele];
}Person;
typedef struct linknode {
Person person;
struct linknode* next;
}link_node,*link_pnode;
//1.初始化链表
extern void linklist_init(link_pnode* H);
//2.判断结点是否为空
extern bool linklist_isempty(link_pnode h);
//3.链表插入
extern bool linklist_insert(link_pnode p);
//4.链表删除p的下一个结点
extern bool linklist_del(link_pnode p);
//5.链表遍历
extern void linklist_travel(link_pnode h);
//6.菜单
extern void menu(void);
#endif
2.2 函数实现
#define _CRT_SECURE_NO_WARNINGS
#include "linklist.h"
void linklist_init(link_pnode* H) {
*H = (link_pnode)malloc(sizeof(link_node));
if (NULL == *H) {
perror("malloc");
return;
}
(*H)->next = NULL;
}
bool linklist_isempty(link_pnode h) {
if (h->next == NULL)
return true;
else
return false;
}
bool linklist_insert(link_pnode p) {
link_pnode new;
new = (link_pnode)malloc(sizeof(link_node));
if (NULL == new) {
perror("malloc");
return false;
}
printf("请输入名字>\n");
scanf("%s",new->person.name);
printf("请输入性别>\n");
scanf("%s",new->person.sex);
printf("请输入年龄>\n");
scanf("%d",&(new->person.age));
printf("请输入电话>\n");
scanf("%s",new->person.tele);
new->next = p->next;
p->next = new;
printf("插入完毕!\n");
return true;
}
bool linklist_del(link_pnode p) {
//删掉P下一个结点
link_pnode temp;
temp = (link_pnode)malloc(sizeof(link_node));
temp = p->next;
p->next = temp->next;
free(temp);
printf("删除成功!\n");
return true;
}
void linklist_travel(link_pnode h) {
link_pnode p;
printf("==========电子通讯录===========\n");
printf(" 姓名 性别 年龄 电话 \n");
printf("-------------------------------\n");
for (p = h->next; p != NULL; p = p->next)
printf(" %s %s %d %s\n", p->person.name, p->person.sex, p->person.age, p->person.tele);
}
void menu(void)
{
printf("================================\n");
printf(" 电子通讯录\n");
printf(" 1 - 录入信息\n");
printf(" 2 - 删除信息\n");
printf(" 3 - 查看信息\n");
printf(" 4 - 退出系统\n");
printf("=================================\n");
}
2.3 测试文件
#define _CRT_SECURE_NO_WARNINGS
#include "linklist.h"
int main() {
link_pnode h, p, t;
char dname[20];
int n1,flag;
linklist_init(&h);
while (1) {
menu();
printf("请选择操作>\n");
scanf("%d",&n1);
switch (n1) {
case 1:
//找到最后一个结点
for (p = h; p->next != NULL; p = p->next);
linklist_insert(p);
break;
case 2:
flag = 0;
printf("输入要删除人的姓名>\n");
scanf("%s",dname);
for(p=h,t=h->next;t!=NULL;p=t,t=t->next)
if (t->person.name == dname)
{
linklist_del(p);
flag = 1;
}
if (!flag && (p->next == NULL))
printf("要删除的学生不存在\n");
break;
case 3:
if (linklist_isempty(h))
printf("表中无数据,请添加\n");
else
{
linklist_travel(h);
}
break;
case 4:
printf("再见啦,好朋友\n");
exit(0);
break;
}
}
return 0;
}
2.4 Makefile文件
CC = gcc
CFLAGS = -Wall -O0 -g
SRC = ${wildcard *.c}
OBJS=test
all:$(OBJS)
$(OBJS):$(SRC)
$(CC) $(CFLAGS) $^ -o $@
clean:
$(RM) $(OBJS)
结果展示
3.1 编译运行
3.2 插入数据并查看
3.3 退出系统
如果这份博客对大家有帮助,希望各位给S学长一个免费的点赞👍作为鼓励,并评论收藏一下⭐,谢谢大家!!!
制作不易,如果大家有什么疑问或给S学长的意见,欢迎评论区留言。