You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何关联存储人员信息的链表与商品栈以实现商店系统?

实现人员链表与商品栈的关联方案

需求说明

开发商店系统,已实现存储人员信息(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 11:05:17