目录
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);
}