1.4.课设实验-数据结构-单链表-文教文化用品品牌2.0

一.题目:

题目见"1.2.课设实验-数据结构-单链表-文教文化用品品牌"的题目。

二.参考代码:

cpp 复制代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MaxSize 10 //定义顺序表最大长度

static int result; //字符串比较结果
static int i; //循环初始值 
static bool flag; //记录结果为真/假
static int ListLen;//记录单链表长度,全局要用,一开始长度为0 

//品牌型号
typedef struct
{
	char model[10];
}BModel; 

//品牌信息 
typedef struct
{
	//品牌编号 
	char BH[5];
	//品牌名
	char BN[15];  
	//该品牌被查找的次数
	unsigned int num;
}Goods;

//存储文教文化用品(商品)的顺序表
typedef struct
{
	//品牌 
	Goods *g;
	//品牌型号数组 
	BModel bm[MaxSize];
	//顺序表当前长度,多一个型号则长度加一 
	int length; 
}BrandSqList; 

//文教文化用品的品牌形成的单链表
typedef struct LNode
{
	//指向下一个品牌的指针,类型要用struct LNode而不是LNode,原因和下一行同理 
	struct LNode *next;//此时不能用*LinkList,因为此时还没有定义*LinkList,这个是结构体定义完才有的
	//文教文化用品的顺序表,一个结点是一个品牌顺序表 
	BrandSqList BList;  
}LNode,*LinkList;//前者强调结点,后者强调单链表(两者等价)

//初始化单链表(带头结点) 
bool InitLinkList(LinkList &L) //注意加& 
{
	//1.分配头结点
	L = (LNode *)malloc(sizeof(LNode));
	//2.判断
	if(L==NULL)
	{
		return false; //内存不足,分配失败 
	} 
	else
	{
		//分配成功
		L->next = NULL; //头结点之后暂时还没有结点
		return true; 
	}
} 

//初始化顺序表
bool InitBrandSqList(BrandSqList &inBList) //记得加&,因为初始化,值改变了 
{
	//1.为顺序表分配数组空间
	inBList.g = new Goods[MaxSize]; //new的是Goods,不是BrandSqList,因为分配给商品 
	//2.判断 
	if( inBList.g ) 
	{
		//分配成功 
		inBList.length = 0; //一开始长度为0
		return true;
	}
	else
	{
		return false;//内存不足,分配失败  
	}
} 

//判断最终结果的函数 
void final(bool flag)
{
	if(flag) 
	{
		printf("成功 \n");
	}
	else
	{
		printf("失败 \n");
	} 
}

//顺序表内容赋值
void inputInBList(BrandSqList &inBList,int i) //需要&,因为顺序表值变了 
{
	printf("第%d个品牌: \n",i);
	//1.品牌编号
	printf("请输入品牌编号:");
	scanf("%s",inBList.g->BH);
	//2.品牌名
	printf("请输入品牌名:");
	scanf("%s",inBList.g->BN); //直接给字符数组录入即可
	//3.查找频次一开始为0
	inBList.g->num=0; 
} 

//添加品牌到单链表:在p结点之后插入下一个结点(顺序表)->该添加属于指定结点添加 
/* L每次是单链表的第一个元素即头结点,
   BrandSqList inBList是要插入的元素 */ 
//i为位序,如第一次插在第一个位置,再比如i为2代表插在第二个位置上,就要找到第一个位置插在他的后面   
bool InsertNextNode(LinkList &L,BrandSqList inBList,int i) //inBList不用加&,因为只是添加到单链表,值没变 
{
	//1.判断位序是否合法
	if(i<1)
	{
		printf("--");
		return false; //位序必须是正整数 
	} 
	//此时位序合法 
	//2.建立指针p指向当前扫描到的结点
	LNode *p;
	//3.设置变量记录p扫描到第几个结点
	int j=0;//一开始是头结点即为0 
	//4.L指向头结点,头结点是第0个元素(不存数据)
	p=L;
	//5.循环找到第i-1个结点 
	while(p!=NULL && j<i-1)
	{
		p = p->next;
		j++;
	}
	//6.判断p
	if(p==NULL)
	{
		return false; //说明i不合法 
	} 
	//7.给新结点申请内存空间
	LNode *s = (LNode *)malloc(sizeof(LNode));
	//8.判断s
	if(s==NULL)
	{
		return false; //内存不足,分配失败 
	} 
	//9.把要添加的数据赋给空间s
	s->BList = inBList;
	//10.修改指针
	s->next = p->next;
	p->next = s;
	//11.结果 
	return true; 
} 

//插入品牌的函数(要输入顺序表内容)
bool InsertBrand(LinkList &L,int i) //要加&,因为单链表发生了改变 
{
		//1.创建顺序表-->不能只在主函数中开头创建一个,因为单链表里不止一个顺序表 
		BrandSqList inBList; //顺序表创建后要全局用 
		//2.初始化顺序表
		InitBrandSqList(inBList);
		//3.顺序表内容赋值
	    inputInBList(inBList,i); //i也是编号 
	    //4.插入品牌 
		flag=InsertNextNode(L,inBList,i);
		if(flag)
	    {
	    	printf("*该品牌添加成功* \n");
		}
		else
		{
			printf("该品牌添加失败 \n");
			return false;
		}
		//5.此时插入成功,单链表长度加一
		ListLen++; 
		//6.结果
		return true; 
} 

//删除单链表里的品牌-->对于最后一个结点有限制 
/*需要单链表,要删除的品牌*/
bool DeleteNode(LinkList &L,char outBListBN[15]) 
{ 
	//1.遍历单链表的品牌,找是否有与要删除的品牌所匹配的
	LNode *p = L->next; //跳过头结点,用LNode结点记录,这样稳妥,不容易出bug 
	while(p!=NULL)
	{
		result = strcmp(p->BList.g->BN,outBListBN);
		if(result==0) 
		{
			break; //找到了,跳出循环,此时L不为NULL 
		}
		else
		{
			p = p->next; //没找到,后移 
		} 
	}
	//2.判断L结点
	if(p==NULL) return false; //此时代表没找到
	//3.此时找到了,开始删除对应的结点L即修改指针
	 //3.1.令q指向*L的后继结点
	 LNode *q = p->next;
	 //3.2.和后继结点交换数据域
	 p->BList = q->BList;
	 //3.3.将*q结点从链中断开
	 p->next = q->next; 
	 //3.4.释放后继结点的存储空间
	 free(q); 
	//4.单链表长度减一
	ListLen--; 
	//5.结果 
	return true; 
}

//查找品牌
/*需要单链表,要查找的品牌*/
LinkList LocateElem(LinkList &L,char findBListBN[15])
{
	//1.跳过没数据的头结点
	L = L->next;
	//2.定义q来记录结点
	LNode *q = L;
	//3.遍历单链表开始查找
	while( q!=NULL &&  (result=strcmp(q->BList.g->BN,findBListBN )!=0) )
	{
		q = q->next;
	} 
	//4.判断
	if(q==NULL) //要么到了最后一个结点都没找到,要么全都没有 
	{
		printf("品牌%s不存在 \n",findBListBN);
		return L; //代表此时没找到 
	} 
	//此时找到了,查找频次域加一 
	printf("品牌%s存在 \n",findBListBN);
	q->BList.g->num++;
	return L; 
} 

//改变商品的内容
/* 需要要改变的品牌,单链表 */
LinkList changeGoods(LinkList &L,char inBListBN[15]) 
{
	//ListLen=funListLen(L); //求出单链表长度 
	//1.查找要改变的品牌是否存在
	LNode *q=LocateElem(L,inBListBN);
	if(q==NULL)
	{
		//此时不存在
		printf("要改变的品牌不存在 \n");
		return L; 
	} 
	//此时存在
	//2.改变品牌内容,重新赋值
	inputInBList(q->BList,ListLen); 
	//3.结果
	return L; 
}

int main()
{
	//1.创建品牌单链表
	LinkList L;
	//2.初始化单链表
	InitLinkList(L); 
	static int index=0; //记录品牌代号即编号,不是第几个 
	printf("请输入插入品牌的个数:");
	int size;
	scanf("%d",&size);
	for(i=0;i<size;i++)
    { 
		index++;
		InsertBrand(L,index);
	}
	printf("------------------------------------------------------------- \n");
		char outBListBN[15];
	    printf("请输入要删除的品牌:");
	    scanf("%s",outBListBN); 
	    flag=DeleteNode(L,outBListBN);
	    printf("删除"); final(flag);
	printf("------------------------------------------------------------- \n");
	char changeBListBN[15];
		    	printf("请输入要修改的品牌:");
		    	scanf("%s",changeBListBN); 
		    	L=changeGoods(L,changeBListBN);
		    	//printf("修改"); final(flag);
	printf("------------------------------------------------------------- \n");
	char findBListBN[15];
	            printf("请输入要查找的品牌:");
	            scanf("%s",findBListBN);
	            flag=LocateElem(L,findBListBN);
	            printf("查找"); final(flag);
	printf("------------------------------------------------------------- \n");            
	return 0;    
}

相关推荐
云边有个稻草人3 小时前
Rust 借用分割技巧:安全解构复杂数据结构
数据结构·安全·rust
侯小啾3 小时前
【22】C语言 - 二维数组详解
c语言·数据结构·算法
qq_479875433 小时前
Linux time function in C/C++【2】
linux·c语言·c++
TL滕3 小时前
从0开始学算法——第一天(如何高效学习算法)
数据结构·笔记·学习·算法
yuuki2332334 小时前
【数据结构】双向链表的实现
c语言·数据结构·后端
ol木子李lo4 小时前
Doxygen入门指南:从注释到自动文档
c语言·c++·windows·编辑器·visual studio code·visual studio·doxygen
我不是彭于晏丶4 小时前
238. 除自身以外数组的乘积
数据结构·算法
代码雕刻家5 小时前
1.6.课设实验-数据结构-栈、队列-银行叫号系统2.0
c语言·数据结构
yq14682860905 小时前
C (统计二进制中“1“的个数)
c语言·开发语言·算法