一.题目:
题目见"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;
}