C语言 链表的简单使用

目录

C语言链表的学习,以菜谱结构体为例,相关源码如下,仅供学习使用

1.menu.h

2.menu.c

3.main.c 


C语言链表的学习,以菜谱结构体为例,相关源码如下,仅供学习使用

1.menu.h

#ifndef MENU_H
#define MENU_H

typedef struct menu_t
{
	int menu_id;
	char name[20];
	double price;
	struct menu_t *pnext;//指针 指向下个结构体存储的地址
}MENU_T;

//初始化链表头
MENU_T *menuList_init();

//把结构体添加到链表的尾部
void menuList_add(MENU_T *head,MENU_T menu);

//统计链表的节点个数
int menuList_count(MENU_T *head);

/*
获取某个节点的数据
参数1:链表头 
参数2:第几个节点(不包括头)
返回值:找到节点的地址
1.遍历链表 指针域不为空计数
2.判断计数值与pos是否一样
如果一样 说明找到了 返回当前这个节点的地址
*/
MENU_T* getMenuInfoByPos(MENU_T *head,int pos);

/*
获取某个节点的数据
参数1:链表头 
参数2:第几个节点(不包括头)
返回值:找到节点的地址
1.遍历链表 指针域不为空计数
2.菜品名称跟name一样
如果一样 说明找到了 返回当前这个节点的地址
*/
MENU_T* getMenuInfoByName(MENU_T *head,char *name);

/*
获取某个节点的数据
参数1:链表头 
参数2:第几个节点(不包括头)
返回值:找到节点的地址
1.遍历链表 指针域不为空计数
2.菜品id跟传参的id一样
如果一样 说明找到了 返回当前这个节点的地址
*/
MENU_T* getMenuInfoById(MENU_T *head,int id);

//打印链表中节点的所有的数据--遍历
void MenuList_printInfo(MENU_T *head);

/*
在第几个节点的后面插入新节点,也就是菜品信息
1遍历整条链表,找到第几个节点
2找到之后插入
*/
void MenuList_InsertByPos(MENU_T *head,MENU_T menu,int pos);

/*  
删除第几个节点
在第几个节点的后面删除节点,也就是菜品信息
1遍历整条链表,找到第几个节点
2找到之后删除
*/
int MenuList_DeleteByPos(MENU_T *head,int pos);

//释放整条链表
void freeMenuList(MENU_T *head);

#endif

2.menu.c

#include"menu.h"
#include<stdlib.h>

//初始化链表头
MENU_T *menuList_init()
{
	//创建菜谱结构体指针变量
	MENU_T *head = NULL;
	//动态开空间
	head = (MENU_T *)malloc(sizeof(MENU_T));
	if(head == NULL)
	{
		printf("open fail\n");
		exit(0);
	}

	//初始化 数据域
	memset(head,'\0',sizeof(MENU_T));
	//初始化指针域
	head->pnext = NULL;
	return head;
}

//把结构体添加到链表的尾部
void menuList_add(MENU_T *head,MENU_T menu)
{
	MENU_T *tmp=head;
	MENU_T *pNewNode = NULL; //新节点
	//判断pnext是否为空  找到链表的尾部
	while(tmp->pnext!=NULL)
	{
		tmp=tmp->pnext;	
	}
	//动态开空间
	pNewNode = (MENU_T *)malloc(sizeof(MENU_T));
	if(pNewNode==NULL)
	{
		printf("open fail\n");
		exit(0);	
	}

	//初始化 数据域
	memset(pNewNode,'\0',sizeof(MENU_T));
	//数据域赋值
	memcpy(pNewNode,&menu,sizeof(MENU_T));

	//新节点连接到上一个节点的指针域
	tmp->pnext = pNewNode;
}

//统计链表的节点个数
int menuList_count(MENU_T *head)
{
	//每一个节点找pnext 判断一下是否为空
	//不为空 +1
	int count =0;
	MENU_T *tmp=head;
	while(tmp->pnext!=NULL)
	{
		count++;
		tmp=tmp->pnext;
	}
    return count;
}

/*
获取某个节点的数据
参数1:链表头 
参数2:第几个节点(不包括头)
返回值:找到节点的地址
1.遍历链表 指针域不为空计数
2.判断计数值与pos是否一样
如果一样 说明找到了 返回当前这个节点的地址
*/
MENU_T* getMenuInfoByPos(MENU_T *head,int pos)
{
	//每一个节点找pnext 判断下一个是否为空
	//不为空+1
	int count =0;
	MENU_T *tmp=head;
	while(tmp->pnext!=NULL)
	{
		count++;
		tmp=tmp->pnext;
		if(pos==count)  //是不是找到了
		{
			return tmp;		
		}	
	}
	return NULL;
}

/*
获取某个节点的数据
参数1:链表头 
参数2:第几个节点(不包括头)
返回值:找到节点的地址
1.遍历链表 指针域不为空计数
2.菜品名称跟name一样
如果一样 说明找到了 返回当前这个节点的地址
*/
MENU_T* getMenuInfoByName(MENU_T *head,char *name)
{
	//每一个节点找pnext 判断下一个是否为空
	//不为空+1
	int count =0;
	MENU_T *tmp=head;
	while(tmp->pnext!=NULL)
	{
		count++;
		tmp=tmp->pnext;
		if(strcmp(name,tmp->name)==0)  //是不是找到了
		{
			return tmp;		
		}	
	}
	return NULL;
}

/*
获取某个节点的数据
参数1:链表头 
参数2:第几个节点(不包括头)
返回值:找到节点的地址
1.遍历链表 指针域不为空计数
2.菜品id跟传参的id一样
如果一样 说明找到了 返回当前这个节点的地址
*/
MENU_T* getMenuInfoById(MENU_T *head,int id)
{
	//每一个节点找pnext 判断下一个是否为空
	//不为空+1
	int count =0;
	MENU_T *tmp=head;
	while(tmp->pnext!=NULL)
	{
		count++;
		tmp=tmp->pnext;
		if(id==tmp->menu_id)  //是不是找到了
		{
			return tmp;		
		}	
	}
	return NULL;
}

//打印链表中节点的所有的数据--遍历
void MenuList_printInfo(MENU_T *head)
{
	int count =0;
	MENU_T *tmp=head;
	while(tmp->pnext!=NULL)
	{
		tmp=tmp->pnext;
		printf("%d\t%s\t%.1f\n",tmp->menu_id,tmp->name,tmp->price);
	}
}

/*
在第几个节点的后面插入新节点,也就是菜品信息
1遍历整条链表,找到第几个节点
2找到之后插入
*/
void MenuList_InsertByPos(MENU_T *head,MENU_T menu,int pos)
{
	//每一个节点找pnext判断一下是否为空
	//不为空+1
	int count =0;
	MENU_T *tmp=head;
	MENU_T *newNode =NULL;
	while(tmp->pnext!=NULL)
	{
		count++;
		tmp=tmp->pnext;
		if(pos==count)  //是不是找到了
		{
			//newNode开空间初始化,数据域内存copy
			newNode=(MENU_T *)malloc(sizeof(MENU_T));
			memset(newNode,'\0',sizeof(MENU_T));
			memcpy(newNode,&menu,sizeof(MENU_T));  //数据域
	
			//newNode pnext指向 当前的下一个
			newNode->pnext=tmp->pnext;
            //当前的下一个指向 新节点
			tmp->pnext=newNode;
			break;		
		}	
	}
}

//删除第几个节点
int MenuList_DeleteByPos(MENU_T *head,int pos)
{
	int count =0;
	MENU_T *tmp=head->pnext,*pre = head; //pre 记住上一个节点
	while(tmp!=NULL)
	{
		count++;
		if(count==pos)
		{
			//上个节点的pnext=tmp->pnext
			pre->pnext=tmp->pnext;
			free(tmp);
			return 1;//删除成功		
		}
		pre=pre->pnext;
		tmp=tmp->pnext;
	}
	return -1;//没找到
}

//释放整条链表
void freeMenuList(MENU_T *head)
{
	MENU_T *tmp=head;
	while(tmp->pnext!=NULL)
	{
		head = head->pnext;
		free(tmp);
		tmp=head;	
	}
	free(tmp);
}

3.main.c 

3.1 main.c 到位置在第二节点的菜的编号

#include<stdio.h>
#include"menu.h"
#include<stdlib.h>//memset
#include<string.h>//strcpy

void demo4_getInfoBy();

int main()
{
    demo4_getInfoBy();
	return 0;
}

void demo4_getInfoBy()
{
	int count =0;
	//创建结构体指针
	MENU_T *head =NULL;
	MENU_T *pmenu=NULL;
	MENU_T menu1={1001,"沙茶面",18.8};
	MENU_T menu2={1002,"黄焖鸡",16.8};
	MENU_T menu3={1003,"酸辣粉",38.8};
	head=menuList_init();
//	printf("创建链表头成功!\n");
	//定义的结构体按照顺序添加到链表头后面
	menuList_add(head,menu1);
	menuList_add(head,menu2);
	menuList_add(head,menu3);
	
	count = menuList_count(head);
//	printf("一共有%d个菜\n",count);

	pmenu=getMenuInfoByPos(head,2);
	printf("找到位置在第二节点的菜的编号\n");
	printf("%d\n",pmenu->menu_id);
	//找到位置在第二节点的菜的编号
    //1002
}

3.2 main.c 到酸辣粉的编号

#include<stdio.h>
#include"menu.h"
#include<stdlib.h>//memset
#include<string.h>//strcpy

void demo4_getInfoBy();

int main()
{
    demo4_getInfoBy();
	return 0;
}

void demo4_getInfoBy()
{
	int count =0;
	//创建结构体指针
	MENU_T *head =NULL;
	MENU_T *pmenu=NULL;
	MENU_T menu1={1001,"沙茶面",18.8};
	MENU_T menu2={1002,"黄焖鸡",16.8};
	MENU_T menu3={1003,"酸辣粉",38.8};
	head=menuList_init();
//	printf("创建链表头成功!\n");
	//定义的结构体按照顺序添加到链表头后面
	menuList_add(head,menu1);
	menuList_add(head,menu2);
	menuList_add(head,menu3);
	
	count = menuList_count(head);
//	printf("一共有%d个菜\n",count);

    pmenu =getMenuInfoByName(head,"酸辣粉");
	printf("找到酸辣粉的编号\n");
	printf("%d\n",pmenu->menu_id);
	//找到酸辣粉的编号
    //1003
}

3.3 main.c 到编号为1001的菜的名字

#include<stdio.h>
#include"menu.h"
#include<stdlib.h>//memset
#include<string.h>//strcpy

void demo4_getInfoBy();

int main()
{
    demo4_getInfoBy();
	return 0;
}

void demo4_getInfoBy()
{
	int count =0;
	//创建结构体指针
	MENU_T *head =NULL;
	MENU_T *pmenu=NULL;
	MENU_T menu1={1001,"沙茶面",18.8};
	MENU_T menu2={1002,"黄焖鸡",16.8};
	MENU_T menu3={1003,"酸辣粉",38.8};
	head=menuList_init();
//	printf("创建链表头成功!\n");
	//定义的结构体按照顺序添加到链表头后面
	menuList_add(head,menu1);
	menuList_add(head,menu2);
	menuList_add(head,menu3);
	
	count = menuList_count(head);
//	printf("一共有%d个菜\n",count);

    pmenu =getMenuInfoById(head,1001);
	printf("找到编号为1001的菜的名字\n");
	printf("%s\n",pmenu->name);
	//找到编号为1001的菜的名字
    //沙茶面
}

3.4 main.c 打印所有菜的信息[看]

#include<stdio.h>
#include"menu.h"
#include<stdlib.h>//memset
#include<string.h>//strcpy

void demo4_getInfoBy();

int main()
{
    demo4_getInfoBy();
	return 0;
}

void demo4_getInfoBy()
{
	int count =0;
	//创建结构体指针
	MENU_T *head =NULL;
	MENU_T *pmenu=NULL;
	MENU_T menu1={1001,"沙茶面",18.8};
	MENU_T menu2={1002,"黄焖鸡",16.8};
	MENU_T menu3={1003,"酸辣粉",38.8};
	head=menuList_init();
//	printf("创建链表头成功!\n");
	//定义的结构体按照顺序添加到链表头后面
	menuList_add(head,menu1);
	menuList_add(head,menu2);
	menuList_add(head,menu3);
	
	count = menuList_count(head);
//	printf("一共有%d个菜\n",count);

	printf("打印所有菜的信息\n");
	MenuList_printInfo(head);
	//打印所有菜的信息
    //1001    沙茶面  18.8
    //1002    黄焖鸡  16.8
    //1003    酸辣粉  38.8
}

3.5 main.c 牛肉串信息在黄焖鸡和酸辣粉之间

#include<stdio.h>
#include"menu.h"
#include<stdlib.h>//memset
#include<string.h>//strcpy

void demo4_getInfoBy();

int main()
{
    demo4_getInfoBy();
	return 0;
}

void demo4_getInfoBy()
{
	int count =0;
	//创建结构体指针
	MENU_T *head =NULL;
	MENU_T *pmenu=NULL;
	MENU_T menu1={1001,"沙茶面",18.8};
	MENU_T menu2={1002,"黄焖鸡",16.8};
	MENU_T menu3={1003,"酸辣粉",38.8};
	MENU_T menu4={1004,"牛肉串",20.5};
	head=menuList_init();
//	printf("创建链表头成功!\n");
	//定义的结构体按照顺序添加到链表头后面
	menuList_add(head,menu1);
	menuList_add(head,menu2);
	menuList_add(head,menu3);
	
	count = menuList_count(head);
//	printf("一共有%d个菜\n",count);

	printf("牛肉串信息加在黄焖鸡和酸辣粉之间\n");
	MenuList_InsertByPos(head,menu4,2);
	printf("打印所有菜的信息\n");
	MenuList_printInfo(head);
	//牛肉串信息加在黄焖鸡和酸辣粉之间
    //打印所有菜的信息
    //1001    沙茶面  18.8
    //1002    黄焖鸡  16.8
    //1004    牛肉串  20.5
    //1003    酸辣粉  38.8
}

3.6 main.c 除黄焖鸡信息

#include<stdio.h>
#include"menu.h"
#include<stdlib.h>//memset
#include<string.h>//strcpy

void demo4_getInfoBy();

int main()
{
    demo4_getInfoBy();
	return 0;
}

void demo4_getInfoBy()
{
	int count =0;
	//创建结构体指针
	MENU_T *head =NULL;
	MENU_T *pmenu=NULL;
	MENU_T menu1={1001,"沙茶面",18.8};
	MENU_T menu2={1002,"黄焖鸡",16.8};
	MENU_T menu3={1003,"酸辣粉",38.8};

	head=menuList_init();
//	printf("创建链表头成功!\n");
	//定义的结构体按照顺序添加到链表头后面
	menuList_add(head,menu1);
	menuList_add(head,menu2);
	menuList_add(head,menu3);
	
	count = menuList_count(head);
//	printf("一共有%d个菜\n",count);

    printf("删除黄焖鸡信息\n");
	MenuList_DeleteByPos(head,2);
	printf("打印所有菜的信息\n");
	MenuList_printInfo(head);
	//删除黄焖鸡信息
    //打印所有菜的信息
    //1001    沙茶面  18.8
    //1003    酸辣粉  38.8
}

3.7 main.c 释放所有信息

#include<stdio.h>
#include"menu.h"
#include<stdlib.h>//memset
#include<string.h>//strcpy

void demo4_getInfoBy();

int main()
{
    demo4_getInfoBy();
	return 0;
}

void demo4_getInfoBy()
{
	int count =0;
	//创建结构体指针
	MENU_T *head =NULL;
	MENU_T *pmenu=NULL;
	MENU_T menu1={1001,"沙茶面",18.8};
	MENU_T menu2={1002,"黄焖鸡",16.8};
	MENU_T menu3={1003,"酸辣粉",38.8};
	head=menuList_init();
	printf("创建链表头成功!\n");
	//定义的结构体按照顺序添加到链表头后面
	menuList_add(head,menu1);
	menuList_add(head,menu2);
	menuList_add(head,menu3);
	
	count = menuList_count(head);
	printf("一共有%d个菜\n",count);

	//释放所有信息
	freeMenuList(head);
	count=menuList_count(head);
	printf("一共有%d个菜\n",count);
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chenruhan_QAQ_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值