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

题目:

代码:

正解:

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

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

/*
//求单链表的长度
int funListLen(LinkList &L)
{
	L = L->next;//跳过头结点 
	while(L!=NULL)
	{
		ListLen++; //先长度加一 
		L = L->next; //再跳到下一个结点,上下两句不能换,因为此时是跳过了头结点 
	} 
	return ListLen;
}
*/
 

//判断最终结果的函数 
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)
	{	
		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.初始化顺序表
		flag=InitBrandSqList(inBList);
	    if(flag)
	    {
	    	printf("顺序表初始化成功 \n");
		}
		else
		{
			printf("顺序表初始化失败 \n");
			return false;
		}
		//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;//这行改变传入的 L 指针,这可能会导致调用者在后续操作出现问题。*/
	// 1.跳过没数据的头结点,定义q来记录结点
    LNode *q = L->next;
	//2.遍历单链表开始查找
	while( q!=NULL)
	{
		result=strcmp(q->BList.g->BN,findBListBN );//判断品牌名是否匹配 
		if(result==0)
		{
			break; // 找到了,跳出循环
		}
		q = q->next;
	} 
	//3.判断
	if(q==NULL) //要么到了最后一个结点都没找到,要么全都没有 
	{
		printf("品牌%s不存在 \n",findBListBN);
		return NULL; //代表此时没找到,返回NULL,别写返回q,有问题 
	} 
	//此时找到了,查找频次域加一 
	printf("品牌%s存在 \n",findBListBN);
	q->BList.g->num++;
	return q; 
} 



//改变商品的内容
/* 需要要改变的品牌,单链表 */
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; 
}
/*------------------------------王豪杰-------------------------------------*/


/*------------------------------杨志-------------------------------------*/
//显示所有品牌(头结点没数据,但不为NULL->最终不能打印头结点)
void displayAllBrands(LinkList &L)
{
	//1.记录所在结点 
    LNode *q = L;
	//2.遍历单链表开始显示 
    while(q!=NULL)
    {
    	//3.第一次时跳过没数据的头结点 
    	q = q->next;
    	//3.判断结点是否为空 
		if (q == NULL)
        {
          printf("显示完毕,没有品牌信息可以显示。\n");
          return;
        } 
        printf("品牌编号:%s,品牌名:%s,查找频次为:%d \n", 
	    q->BList.g->BH , q->BList.g->BN , q->BList.g->num );
    }
}

//查找最后一名品牌
void findLastBrand(LinkList &L)
{
    if(L!=NULL)
	{  
       while(L->next != NULL)
	   {
         L = L->next;
       }
       printf("最后一名品牌编号:%s,品牌名:%s,查找频次为:%d \n", 
	            L->BList.g->BH , L->BList.g->BN , L->BList.g->num );
    }
}
/*------------------------------杨志-------------------------------------*/


/*------------------------------青格勒-------------------------------------*/
//记录品牌频次的函数
/*需要单链表,当前单链表的长度,新的单链表*/
LinkList funNewLinkList(LinkList &L)
{
	LNode *q = L; //记录头结点 
	LNode *p = L; //记录头结点 
	LNode *Lp = L->next;//跳过头结点 
	//1.定义旧的单链表的频次数组
	int arrListLen[ListLen];
	//2.把单链表里的品牌被查找的次数存入频次数组 
	for(i=0;i<ListLen;i++) 
	{
		arrListLen[i]=Lp->BList.g->num;//赋值频次
		Lp = Lp->next; //下一个结点 
	}
	//3.把频次数组按照降序的顺序排序(冒泡排序)
	 //3.1.外循环:循环轮数,长度减一,因为最后一个直接成型 
	 for(int j=0 ; j<ListLen-1 ; j++) 
	 {
	 	//3.2.内循环:相邻两个数依次比较 
	 	for(i=0 ; i<ListLen-1-j ; i++ )
	 	{
	 		//3.3.判断 
	 		if(arrListLen[i]<arrListLen[i+1])
	 		{
	 			int temp=arrListLen[i];
	 			arrListLen[i]=arrListLen[i+1];
	 			arrListLen[i+1]=temp;
			}
		}
	 } 
	//4.根据降序后的频次改变结点位置(要按照频次降序排序) 
	  //4.1.遍历频次数组(此时已经降序排序)取出元素,元素就是品牌查找频次
	  /*这里i+1可以作为结点位置,从1开始好一些,i一开始为0加一即为1 
	    因为频次数组的索引,如第一个索引即1对应的频次,对应的品牌,就是要插在单链表第一个结点的品牌,*/
	    for(i=0;i<ListLen;i++)
	    {
	  	    /*一定能找到对应的频次,因为数组里的元素就是在旧链表的元素的频次取的,只是换了个位置
			  先记录对应频次的品牌,
		      然后删除掉(单链表长度减一),再添加到单链表对应位置(单链表长度加一)
			  ->单链表长度相当于没变*/
		   //4.2.每次把p弄为头结点,因为要遍历单链表所有内容去找 
		   p=q; //p为头结点 
		   LNode *prev = NULL; // 记录前一个结点
           LNode *current = p->next; // 当前结点

           //4.3.遍历旧链表找出与此次循环中频次相同的元素
           while (current != NULL)  
		   {
               if (arrListLen[i] == current->BList.g->num)// 匹配上了
			   { 
                // 4.2. 记录该品牌
                BrandSqList newBList = current->BList;

                // 4.3. 单链表先删除该品牌
                if (prev == NULL) {
                    p->next = current->next;
                } else {
                    prev->next = current->next;
                }
                free(current);

                // 4.4. 单链表再添加该品牌
                /*LNode *newNode = (LNode *)malloc(sizeof(LNode));
                newNode->BList = newBList;
                newNode->next = p->next;
                p->next = newNode;*/
                InsertNextNode(L,newBList,i+1); 

                // 4.5. 跳出里循环
                break;
            }
            prev = current;
            current = current->next;
            }
        }
    //5. 返回新的排好序的单链表
    return L;
}

		   
		/*   
	       //4.3.遍历旧链表找出与此次循环中频次相同的元素
		   while(p!=NULL) //p是头结点,要跳过 
		   {
		       p = p->next;
			   //4.4.频次匹配(注:一定能找到,因为数组里的元素就是在旧链表的元素的频次取的,只是换了个位置)
			   if(arrListLen[i]==p->BList.g->num) //匹配上了 
			   {
			   	 //4.5.记录该品牌
				 BrandSqList newBList=p->BList;//这个内容已经有了,不用初始化
				 //4.6.单链表先删除该品牌
				 DeleteNode(L,newBList.g->BN);
				 //4.7.单链表再添加该品牌
				 InsertNextNode(L,newBList,i+1);
				 //4.8.跳出里循环 
				 break;	 
			   }  
		   } 	  	 
	  }
    displayAllBrands(L); 
	//5.返回新的排好序的单链表
	return L; 
	*/
	 
	 /*
	 //4.根据降序后的频次把结点添加到新单链表中 
	 //for(i=0;i<ListLen;i++) printf("%d ",arrListLen[i]);
	  //4.1.遍历频次数组(此时已经降序排序)取出元素,元素就是品牌查找频次 
	  for(i=0;i<ListLen;i++)
	  {
	  	
	  	//4.2.遍历旧链表找出与此次循环中频次相同的元素 
	  	 while(p!=NULL) //p是头结点,要跳过 
	  	 {
	  	 	p=p->next;
	  	 	//4.3.频次匹配(注:一定能找到,因为数组里的元素就是在旧链表的元素的频次取的,只是换了个位置)
			if(arrListLen[i]==p->BList.g->num)
			{
				//4.4.找到了,添加到新链表中
				flag=InsertNextNode(newL,p->BList,i+1); //此时i+1才表示位序
				//4.5.判断 
				printf("添加"); final(flag);
				//4.6.跳出循环
				break; 
		    }
	     }
	     //4.7.
		 p=q; 
	  }
	  //5.返回新的单链表
	  return newL; 
	  */	   
/*------------------------------青格勒-------------------------------------*/


/*------------------------------刘佳鑫-------------------------------------*/
//给某个品牌添加型号 
/* 需要单链表,品牌 */
bool InsertBModel(LinkList &L,char inBListBN[15])
{
	//1.判断该品牌是否存在,返回品牌对应的结点 
	LNode *q=LocateElem(L,inBListBN);
	if(q==NULL)
	{
		printf("该品牌不存在 \n");
		return false;
	} 
	//此时品牌存在
	//2.输入品牌中要插入的型号
	printf("品牌存在,请输入要插入的型号:");
	char inBModel[10];
	scanf("%s",inBModel);
	//3.输入型号要插入的位置
	printf("请输入型号要插入的位置:");
	int address;
	scanf("%d",&address); 
	//4.赋值给单链表里的顺序表里的品牌型号
	 //4.1.判断插入的位置是否合法
	 if(address<1|| address > q->BList.length+1 ) 
	 {
	 	return false;
	 }
	 //4.2.判断是否存满
	 if(q->BList.length>=MaxSize) //这里要取等,当等于MaxSize时,说明存满了,就无法后移来空位置添加元素了,上面的L.BList.length+1同理 
	 {
	 	return false;
	 } 
	 //4.3.走到这儿说明能插入数据
	 for(int j=q->BList.length;j>=address;j--)
	 {
	 	//q->BList.bm[j]=q->BList.bm[j-1];
	 	strcpy(q->BList.bm[j].model, q->BList.bm[j-1].model);
	 } 
	 //4.4.最终空出address位置,进行添加 
	 strcpy(q->BList.bm[address-1].model,inBModel);
	//5.顺序表长度加一
	q->BList.length++;  
	//6.结果
	return true; 
}
/*------------------------------刘佳鑫-------------------------------------*/



int main()
{
	
	//1.创建品牌单链表
	LinkList L; 
	//2.初始化单链表
	flag=InitLinkList(L);
	printf("                         单链表初始化"); final(flag);
	
	//3.求出单链表长度
	//ListLen=funListLen(L);这儿不用也不能求单链表长度,因为长度定义为全局变量了,而且现在求了第一次长度为0,添加的函数中在本操作中无法添加成功 
	printf("------------------------------------------------------------- \n");
	//4.文教文化用品页面
	printf("                    欢迎来到文教文化用品页面 \n");
	printf("                         请选择你的操作 \n"); 
	printf("            1.插入品牌                  2.删除品牌 \n");
	printf("            3.修改品牌内容              4.查找品牌 \n");
	printf("            5.显示所有品牌内容          6.查找最后一个品牌 \n"); 
	printf("            7.由频次而降序排列品牌      8.添加品牌中商品型号 \n");
	printf("            9.退出 \n");
	printf("------------------------------------------------------------- \n"); 
	//5.进行操作
	while(true)
	{
		//5.开始选择
		printf("请输入操作序号:");
	    int choice;
	    scanf("%d",&choice);
		switch(choice) 
	    {
	    	
		    case 1:
			{	
			    static int index=0; //记录品牌代号即编号,不是第几个 
			    printf("请输入插入品牌的个数:");
			    int size;
			    scanf("%d",&size);
			    for(i=0;i<size;i++)
			    { 
			    	index++;
			    	flag=InsertBrand(L,index);
			    	if(!flag) continue;//代表此次有误,跳过本次循环 
				}
	            printf("------------------------------------------------------------- \n");
	            break;
			}
		    case 2:
		    {
		    	char outBListBN[15];
	            printf("请输入要删除的品牌:");
	            scanf("%s",outBListBN); 
	            flag=DeleteNode(L,outBListBN);
	            printf("删除"); final(flag);
	            printf("------------------------------------------------------------- \n");
	            break;
			}	
		    case 3:
		    {
		    	char changeBListBN[15];
		    	printf("请输入要修改的品牌:");
		    	scanf("%s",changeBListBN); 
		    	flag=changeGoods(L,changeBListBN);
		    	printf("修改"); final(flag);
	            printf("------------------------------------------------------------- \n");
	            break;
			}
		    case 4:
		    {
		    	char findBListBN[15];
	            printf("请输入要查找的品牌:");
	            scanf("%s",findBListBN);
	            flag=LocateElem(L,findBListBN);
	            printf("查找"); final(flag);
	            printf("------------------------------------------------------------- \n");
	            break;
			}	
		    case 5:
		    {
		    	printf("                         所有品牌如下 \n");
	            displayAllBrands(L);
	            printf("------------------------------------------------------------- \n");
	            break;
			}
			case 6:
			{
				findLastBrand(L); 
	            printf("------------------------------------------------------------- \n");
	            break;
			}	
			case 7:
			{
	            L=funNewLinkList(L);
				printf("新链表顺序生成成功 \n"); 
	            printf("------------------------------------------------------------- \n");
	            break;
			}
			case 8:
			{
				printf("请输入要修改的品牌:");
				char inBListBN[15];
				scanf("%s",inBListBN);	
				flag=InsertBModel(L,inBListBN);
				printf("品牌中的商品型号插入"); final(flag);
				printf("------------------------------------------------------------- \n");
	            break;
			}	
		    default: exit(0);			
	    }
	}
	return 0;
}

草稿1:

#include<stdio.h>
#include<stdlib.h>

//定义文教文化用品品牌类型
struct brand
{
	unsigned int BH; //品牌编号
	char BN[20]; //品牌名
	struct stationery *BList; //品牌商品表指针,这里不能用LNode,因为LNode是结构体定义完才有的,此时还没有 
	struct stationery *next; //指向下一个结点 
};

//定义文教文化用品品牌单链表
typedef struct
{
	struct brand info; //info为品牌信息 
}LNode,*LinkList;//前者强调结点,后者强调单链表(两者等价) 

//初始化单链表(带头结点)
bool InitList(LinkList &L)
{
	L = (LNode *)malloc(sizeof(LNode)); //分配头结点
	if(L==NULL) return false; //代表内存不足,头结点分配失败
	//此时头结点分配成功
	L->next = NULL;//头结点之后即第一个结点暂时还没有结点
	return true; 
} 

//判断单链表是否为空
bool isEmpty(LinkList L)
{
	if(L->next==NULL) return true; //头结点之后为NULL,为空
	else return false;//代表不为空 
} 

//在第i个位置增加元素goods
bool ListInsert(LinkList &L,LNode goods,int i)
{
	//1.判断位序 
	if(i<0) return false; //位序有误,添加失败
	//2.定义变量记录当前的结点,一开始已经定义了单链表,一开始指向头结点,然后一个一个添加 
	LNode *p;
	//3.定义变量记录当前是第几个结点
	int j=0;//一开始为0即头结点
	//4.从头开始找当前结点的前一个结点
	while(p!=NULL&&j<i-1)
	{
		p = p->next;
		j++;
	} 
	if(p==NULL) return false; //说明i值不合法 
	//5.插入元素,此时指向第i-1个元素 
	 //5.1.申请一个空间装要插入的元素
	 LNode *s=(LNode *)malloc(sizeof(LNode));
	 //5.2.放入要插入的元素
	 s->info = goods;
	 //5.3.修改指针
	 s.info->next = p.info->next;
	 p.info->next = s.info;
	//6.插入成功 
	return true; 
} 

int main()
{
	//1.声明单链表
	LinkList L; 
	//2.初始化单链表,需要判断是否分配成功 
	bool flag=InitList(L);
	if(flag) printf("单链表初始化成功 \n"); //分配失败,异常退出
	else exit(1);
	return 0;
}

草稿2:

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

static int result; //字符串比较结果
static int i; //循环初始值 
static bool flag; //记录结果为真/假 

//文教文化用品信息
typedef struct info
{
	//品牌编号 
	unsigned int BH;
	//品牌名
	char BN[15]; 
}Goods;

//文教文化用品的品牌形成的单链表
typedef struct LNode
{
	//文教文化用品
	Goods g; 
	//该品牌被查找的次数
	unsigned int num; 
	//指向下一个元素的指针,类型要用struct LNode而不是LNode,原因和下一行同理 
	struct LNode *next;//此时不能用*LinkList,因为此时还没有定义*LinkList,这个是结构体定义完才有的 
}LNode,*LinkList;//前者强调结点,后者强调单链表(两者等价) 

//存储品牌单链表的顺序表
typedef struct
{
	//品牌单链表 
	LNode L; //LinkList L,不要用这个,因为LinkList是一个指针
	//顺序表当前长度 
	int length; 
}BrandSqList; 


//初始化顺序表
void InitBList(BrandSqList BList[MaxSize]) //BList为数组名,就是地址,无需& 
{
	for(i=0;i<MaxSize;i++)
	{
		//BList[i].L=NULL;不要这么赋值,不好 
		BList = new BrandSqList[MaxSize]; 
	}
	BList[MaxSize].length=0; //一开始长度为0 
}

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


//顺序表添加元素(静态添加10个)
bool BListInsert(BrandSqList BList[MaxSize]) 
{
	//1.品牌名 
	strcpy(BList[0].L.g.BN,"UME"); 
	strcpy(BList[1].L.g.BN,"Staples");
	strcpy(BList[2].L.g.BN,"YiWu");
	strcpy(BList[3].L.g.BN,"Flash");
	strcpy(BList[4].L.g.BN,"Parker");
	strcpy(BList[5].L.g.BN,"LM");
	strcpy(BList[6].L.g.BN,"HERO");
	strcpy(BList[7].L.g.BN,"MaLi");
	strcpy(BList[8].L.g.BN,"deli");
	strcpy(BList[9].L.g.BN,"MG");
	//2.编号以及查找次数 
	for(i=0;i<MaxSize;i++)
	{
		BList[i].L.g.BH=i+1;
		BList[i].L.num=MaxSize-i;
		BList->length++;
	} 
	//3.判断是否越界
	if(BList->length>MaxSize) return false;
	//4.结尾
	 return true;
}

//顺序表删除元素
bool BListDelete(BrandSqList BList[MaxSize],char deleteL[15]) 
{
	int index; //记录索引
	//1.先查找要删除的元素是否存在
	for(i=0;i<MaxSize;i++)
	{
		result=strcmp(deleteL,BList[i].L.g.BN);
		if(result==0)
		{
			index=i;
			break;
		} 
	} 
	//2.如果result不为0时说明不存在,跳出函数
	if(result!=0) return false;
	//3.此时说明存在,开始删除
	for(int j=index;j<BList->length;j++) //元素前移
	{
		BList[j]=BList[j+1];
	} 
	//4.顺序表长度减一
	BList->length--;
	//5.结果
	return true; 
}

//显示所有品牌
void display(BrandSqList BList[MaxSize])
{
	for(i=0;i<BList->length;i++)
	{
		printf("该品牌的名字为%s,编号为%d,查找频次为%d \n", BList[i].L.g.BN , BList[i].L.g.BH , BList[i].L.num);
	}	
} 

//查找前10个品牌的最后一名
 //需要要查找的位序,该位序上要找的商品品牌,顺序表 
void findGoods(int index,char findBN[15],BrandSqList BList[MaxSize])
{
	//先判断要查找的位序是否合法
	if(index >= BList->length || index<0 ) 
	{
		return;
	}
	else if(index<9)
	{
		printf("不存在第十个品牌 \n");
		return;
	}
	result = strcmp(BList[index].L.g.BN,findBN);
	if( result==0 )
	{
	   printf("前10个品牌的最后一名的品牌与要找的品牌%s匹配 \n",findBN);
	   //增加该品牌的查找频次
	   BList[index].L.num++;	
	}
	else
	{
	   printf("前10个品牌的最后一名的品牌与要找的品牌%s不匹配 \n",findBN);
	}
} 


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

int main()
{
	//1.定义品牌商品顺序表
	BrandSqList BList[MaxSize];  
	//2.初始化品牌商品顺序表 
	InitBList(BList); //传数组名即可 
	//3.顺序表添加元素
	flag=BListInsert(BList);
	final(flag); //判断结果 
	//4.显示所有品牌
	display(BList); 
	printf("------------------------------------------------------ \n");
	//5.查找前10个品牌的最后一名
	char findBN[15];
	findGoods(9,strcpy(findBN,"MG"),BList);
	printf("------------------------------------------------------ \n");
	//6.删除品牌
	char deleteL[15];
	flag=BListDelete(BList,strcpy(deleteL,"YiWu"));
	final(flag); //判断结果
	if(flag) display(BList); //删除成功的话显示结果 
	printf("------------------------------------------------------ \n");
	//7.发生查找时按查找频次更改品牌的顺序
	 //7.1.查找两次MG 
	 
	return 0;
}

草稿3:

#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;    
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/886333.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

单目3d重建DUSt3R 笔记

目录 DUSt3R 三维重建 报错RecursionError: maximum recursion depth exceeded in comparison 报错 numpy.core.multiarray failed to import 报错Numpy is not available 解决 升级版mast3r 速度变慢 修改了参数设置脚本&#xff1a; 测试效果 操作技巧 DUSt3R 三维重…

Docker仓库搭建

目录 一、Docker Hub 二、私有Registry仓库搭建 1、下载并开启仓库镜像registry 2、Registry加密传输 3、建立一个registry仓库 4、为客户端建立证书 5、测试 6、为仓库建立登录认证 三、Harbor仓库搭建 Docker 仓库&#xff08;Docker Registry&#xff09; 是用于存…

V3D——从单一图像生成 3D 物体

导言 论文地址&#xff1a;https://arxiv.org/abs/2403.06738 源码地址&#xff1a;https://github.com/heheyas/V3D.git 人工智能的最新进展使得自动生成 3D 内容的技术成为可能。虽然这一领域取得了重大进展&#xff0c;但目前的方法仍面临一些挑战。有些方法速度较慢&…

Part_one C/C++语言数据类型、运算符与表达式

1.0 编写第一个C程序 1.打开Visual Studio点击"创建新项目" 2.点击"空项目"&#xff0c;并点击"下一步" 3.设置"项目名称"并"设置地址" 4.打开项目后&#xff0c;右击"源文件"并选择"添加"的"新建…

基于yolov8深度学习的120种犬类检测与识别系统python源码+onnx模型+评估指标曲线+精美GUI界面目标检测狗类检测犬类识别系统

【算法介绍】 基于YOLOv8深度学习的120种犬类检测与识别系统是一款功能强大的工具&#xff0c;该系统利用YOLOv8深度学习框架&#xff0c;通过21583张图片的训练&#xff0c;实现了对120种犬类的精准检测与识别。 该系统基于Python与PyQt5开发&#xff0c;具有简洁的UI界面&a…

程计软考题2-编译、解释程序翻译阶段

(一) 编译器和解释器的工作阶段 1.编译和解释与源程序的区别 分析&#xff1a;编译和解释是语言处理的两种基本方式。 编译过程包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等阶段&#xff0c;以及符号表管理和出错处理模块。 解释过程在词法、语…

数字经济与新质生产力:地理信息与遥感视角下的深度分析

在数字化浪潮的推动下&#xff0c;我们正见证着生产力的一次历史性飞跃。数字经济如何重塑生产力的三大要素&#xff1a;劳动对象、劳动资料和劳动者&#xff1f;让我们来深度分析数字经济如何推动新质生产力的发展。 一、数字经济与地理信息的融合 地理信息与遥感技术是数字…

【数据结构】什么是红黑树(Red Black Tree)?

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 &#x1f4cc;红黑树的概念 &#x1f4cc;红黑树的操作 &#x1f38f;红黑树的插入操作 &#x1f38f;红黑树的删除操作 结语 &#x1f4cc;红黑树的概念 我们之前学过了…

PyGWalker:让你的Pandas数据可视化更简单,快速创建数据可视化网站

1、PyGWalker应用: 在数据分析的过程中,数据的探索和可视化是至关重要的环节,如何高效地将分析结果展示给团队、客户,甚至是公众,是很多数据分析师和开发者面临的挑战,接下来介绍的两大工具组合——PyGWalker与Streamlit,可以帮助用户轻松解决这个问题,即使没有复杂的代…

cheese安卓版纯本地离线文字识别插件

目的 cheese自动化平台是一款可以模拟鼠标和键盘操作的自动化工具。它可以帮助用户自动完成一些重复的、繁琐的任务&#xff0c;节省大量人工操作的时间。可以采用Vscode、IDEA编写&#xff0c;支持Java、Python、nodejs、GO、Rust、Lua。cheese也包含图色功能&#xff0c;识别…

HarmonyOS鸿蒙 Next 实现协调布局效果

HarmonyOS鸿蒙 Next 实现协调布局效果 ​ 假期愉快! 最近大A 的涨势实在是红的让人晕头转向&#xff0c;不知道各位收益如何&#xff0c;这会是在路上&#xff0c;还是已经到目的地了? 言归正传&#xff0c;最近有些忙&#xff0c;关于鸿蒙的实践系列有些脱节了&#xff0c;…

TCP --- 确认应答机制以及三次握手四次挥手

序言 在前一篇文章中&#xff0c;我们介绍了 UDP协议 (点击查看)&#x1f448;&#xff0c;该协议给我们的感觉就两个字 — 简单&#xff0c;只是将我们的数据进行简单的添加报头然后发送。当然使用起来虽然简单&#xff0c;但是否能送到目的地&#xff0c;那就要看网络的状态了…

深度学习——线性神经网络(一、线性回归)

目录 一、线性回归1.1 线性回归的基本元素1.1.1 术语介绍1.1.2 线性模型1.1.3 损失函数1.1.4 解析解1.1.5 随机梯度下降1.1.6 模型预测 1.2 正态分布与平方损失 因为线性神经网络篇幅比较长&#xff0c;就拆成几篇博客分开发布。目录序号保持连贯性。 一、线性回归 回归&#x…

[Linux] Linux 的进程如何调度——Linux的 O(1)进程调度算法

标题&#xff1a;[Linux] Linux 的进程如何调度——优先级与进程调度 个人主页水墨不写bug 目录 一、前言 二、将要出现的概念 1.进程调度队列 2.位图 3.进程的优先级 三、Linux进程的调度过程 1.活动队列&#xff08;*active指向的队列&#xff09; 2.过期队列&#…

LeetCode[中等] 763. 划分字母区间

给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段&#xff0c;同一字母最多出现在一个片段中。 注意&#xff0c;划分结果需要满足&#xff1a;将所有划分结果按顺序连接&#xff0c;得到的字符串仍然是 s 。 返回一个表示每个字符串片段的长度的列表。 思路 贪心…

Centos 7.9 Kubeadm安装k8s1.20.11

一、环境 主机用途192.168.76.140k8s-master1192.168.76.141k8s-node1 二、设置yum源 由于系统已经关闭&#xff0c;可以用centos9尝试 cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak vi /etc/yum.repos.d/CentOS-Base.repo# 使用阿里云的y…

【动态规划-分组背包】【hard】力扣2218. 从栈中取出 K 个硬币的最大面值和

一张桌子上总共有 n 个硬币 栈 。每个栈有 正整数 个带面值的硬币。 每一次操作中&#xff0c;你可以从任意一个栈的 顶部 取出 1 个硬币&#xff0c;从栈中移除它&#xff0c;并放入你的钱包里。 给你一个列表 piles &#xff0c;其中 piles[i] 是一个整数数组&#xff0c;分…

FOC电机驱动开发踩坑记录

关键技术 SVPWM电机磁场控制电流采样park变换和Clark变换滑膜观测器&#xff08;无感FOC&#xff09; SVPWM电机磁场控制 SVPWM主要思想是通过精确的对UVW三相电流的分时控制&#xff0c;来控制转子的合成力矩&#xff0c;达到目标方向&#xff0c;常用的是6分区的设计&…

浅谈汽车智能座舱如何实现多通道音频

一、引言 随着汽车智能座舱的功能迭代发展&#xff0c;传统的 4 通道、6 通道、8 通道等音响系统难以在满足驾驶场景的需求&#xff0c;未来对于智能座舱音频质量和通道数会越来越高。接下来本文将浅析目前智能座舱如何实现音频功放&#xff0c;以及如何实现多路音频功放方案。…

C语言+单片机

今天内容有点水哈哈&#xff08;忙着练焊铁技术了嘻嘻&#xff09; C语言 简单学习了while语言以及其与for语言的区别和适用方法 .循环结构&#xff1a; 初始化语句条件判断句条件控制句 for语句 for(int1;i<100;i){执行条件} for (int i 1; i < 100; i) {printf(&quo…