如何关联存储人员信息的链表与商品栈以实现商店系统?
实现人员链表与商品栈的关联方案
需求说明
开发商店系统,已实现存储人员信息(ID、姓名)的链表,以及存储商品的栈。需要将两者关联,使每个人员拥有自己的商品栈,示例如下:
Person1:
- Apple
- Orange
Person2: - Strawberry
- Lemon
现有代码问题分析
你提供的代码存在几处关键问题,导致无法实现人员与商品栈的关联:
- 链表插入函数
insert的循环条件错误(a->id < a->id永远为假,无法正确排序插入) - 栈创建函数
createStack中,商品数组的内存分配错误(使用sizeof(int)而非sizeof(PRODUCT)) push函数未递增nItems,导致商品无法正确入栈- 未给每个
Person初始化专属的栈,当前代码中栈是全局共享的 - 打印函数未关联人员与对应商品栈的输出
修正与实现步骤
1. 修复链表插入逻辑
将insert函数中的循环条件改为a->id < person.id,实现按ID升序插入。
2. 修正栈的内存分配
createStack中,商品数组的分配应改为malloc(sizeof(PRODUCT) * capacity),同时初始化nItems为0。
3. 完善push函数
在复制商品后,递增stack->nItems,确保下一次入栈位置正确。
4. 为每个Person初始化专属栈
在插入人员到链表时,为新创建的Person实例分配并初始化栈。
5. 实现给指定人员添加商品的函数
新增函数addProductToPerson,根据ID找到对应人员,将商品推入其专属栈。
6. 完善打印函数
修改printList,在打印人员信息后,调用printStack打印其商品栈。
修正后的完整代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> #define TAM 30 typedef int ID; typedef char PRODUCT[TAM]; typedef struct stack{ int nItems; int capacity; PRODUCT *product; } Stack; typedef struct person{ Stack *stack; ID id; char name[TAM]; struct person *next; }Person; typedef struct list{ Person *head; Person *end; }List; void createList(List *list){ list->head = NULL; list->end = NULL; } // 为人员创建并初始化专属栈 Stack* initPersonStack(int capacity) { Stack *stack = malloc(sizeof(Stack)); stack->product = malloc(sizeof(PRODUCT) * capacity); stack->capacity = capacity; stack->nItems = 0; // 初始化商品数量为0 return stack; } void insert(List *list, Person person, int stackCapacity){ Person *newPerson = (Person*)malloc(sizeof(Person)); Person *ant = NULL; Person *a = list->head; strcpy(newPerson->name, person.name); newPerson->id = person.id; // 为当前人员初始化专属栈 newPerson->stack = initPersonStack(stackCapacity); // 修复循环条件:按ID升序插入 while(a != NULL && a->id < person.id){ ant = a; a = a->next; } if (ant == NULL){ newPerson->next = list->head; list->head = newPerson; }else{ newPerson->next = ant->next; ant->next = newPerson; } } bool push(Stack *stack, PRODUCT product){ if (stack->capacity == stack->nItems){ printf("栈已满,无法添加商品\n"); return false; } strcpy(stack->product[stack->nItems], product); stack->nItems++; // 递增商品计数 return true; } // 根据ID查找人员 Person* findPersonById(List *list, ID id) { Person *current = list->head; while (current != NULL) { if (current->id == id) { return current; } current = current->next; } printf("未找到ID为%d的人员\n", id); return NULL; } // 给指定人员添加商品 bool addProductToPerson(List *list, ID personId, PRODUCT product) { Person *target = findPersonById(list, personId); if (target == NULL) { return false; } return push(target->stack, product); } void printStack(Stack *stack){ if (stack->nItems == 0) { printf(" 暂无商品\n"); return; } for(int i = stack->nItems - 1; i >= 0; i--){ printf(" - %s\n", stack->product[i]); } } void printList(List *list){ Person *a = list->head; while(a != NULL){ printf("Person%d (%s):\n", a->id, a->name); printStack(a->stack); a = a->next; } } // 释放内存,避免泄漏 void freeList(List *list) { Person *current = list->head; while (current != NULL) { Person *temp = current; free(current->stack->product); free(current->stack); current = current->next; free(temp); } list->head = NULL; list->end = NULL; } int main(){ const int STACK_CAPACITY = 10; List list; createList(&list); // 创建人员并插入链表,同时初始化专属栈 Person p1 = {.id = 1, .name = "James"}; Person p2 = {.id = 2, .name = "Alice"}; insert(&list, p1, STACK_CAPACITY); insert(&list, p2, STACK_CAPACITY); // 给人员添加商品 PRODUCT prod1 = "Apple"; PRODUCT prod2 = "Orange"; PRODUCT prod3 = "Strawberry"; PRODUCT prod4 = "Lemon"; addProductToPerson(&list, 1, prod1); addProductToPerson(&list, 1, prod2); addProductToPerson(&list, 2, prod3); addProductToPerson(&list, 2, prod4); // 打印所有人员及其商品 printList(&list); // 释放内存 freeList(&list); return 0; }
代码说明
- 每个
Person实例在创建时会初始化自己的Stack,实现人员与商品栈的一一关联 addProductToPerson函数可以根据ID精准给目标人员添加商品- 打印函数会同时输出人员信息和其对应的商品列表,符合需求示例格式
- 新增了内存释放函数,避免内存泄漏
内容的提问来源于stack exchange,提问作者Leonhard
相关产品推荐
相关产品推荐

