【问题标题】:Stack - Linked list implementation - string not being used correctly堆栈 - 链表实现 - 未正确使用字符串
【发布时间】:2016-07-10 22:30:43
【问题描述】:

我使用链表实现在 C 中创建了一个堆栈。当我尝试输入字符串时遇到问题。在我推入堆栈的每个节点中,所有节点中的字符串都等于顶部节点的字符串的值。 例如:

推-> 行:9 座信:a 名称:fsda

推-> 行:3 座位号:f 名称:jfjfjjf

流行音乐

流行音乐


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

typedef struct {
    int rowNumber;
    char seat;
    char* passengerName;
    struct passengerNode* nextPtr;
} PassengerStack, *PassengerStackPtr;

// prototypes
void top(PassengerStackPtr* topPtr);
void push(PassengerStackPtr* topPtr, int rowNum, char seatLetter, char passengersName[]);
PassengerStackPtr pop(PassengerStackPtr* topPtr);
void printStack(PassengerStackPtr currentPtr);
int full(PassengerStackPtr topPtr);
int empty(PassengerStackPtr topPtr);

int main(void)
{

    PassengerStackPtr passPtr = NULL;
    int choice;
    int rowNumber;
    char seat;
    char passengerName[50];

    printf("Enter choice: \n1 to show the first passenger in the stack. \n2 to push a passenger in the stack. \n3 to "
           "pop off a passenger in the stack. \n4 to print the stack. \n5 to exit the program.");
    scanf("%d", &choice);

    while(choice != 5) {

    switch(choice) {

    case 1:

        top(passPtr);
        break;

    case 2:

        printf("\nEnter a row number: ");
        scanf("%d", &rowNumber);

        printf("\nEnter a seat letter: ");
        scanf("%c", &seat);
        scanf("%c", &seat); //skips over if I don't duplicate (don't know why)

        printf("\nEnter a name for the passenger: ");
        scanf("%s", &passengerName);

        printf("Entered: \n");
        printf("%d", rowNumber);
        printf("\n");
        printf("%c", seat);
        printf("\n");
        printf("%s", passengerName);
        printf("\n");

        push(&passPtr, rowNumber, seat, passengerName);
        break;

    case 3:

        if(!empty(passPtr)) {

        PassengerStackPtr poppedPtr = pop(&passPtr); 
        printf("%d", poppedPtr->rowNumber);
        printf("\n");
        printf("%c", poppedPtr->seat);
        printf("\n");
        printf("%s", poppedPtr->passengerName);

        printf("\n");
        }
        break;

    case 4:

        printStack(passPtr);
        break;

    case 5:

        // add exit here !!!!!!!!!!
        break;

    default:

        printf("Invalid choice.\n\n");
        break;
    }
    printf("Enter a choice: ");
    scanf("%d", &choice);
    }
    printf("End of run.\n");
    return 0;
}

void push(PassengerStackPtr* topPtr, int rowNum, char seatLetter, char* passengersName)
{

    PassengerStackPtr newPtr;

    newPtr = malloc(sizeof(PassengerStackPtr));

    if(newPtr != NULL) {
    newPtr->rowNumber = rowNum;
    newPtr->seat = seatLetter;
    newPtr->passengerName = passengersName;
    newPtr->nextPtr = *topPtr;
    *topPtr = newPtr;
    } else {
    printf("not inserted. No memory available.\n");
    }
}

PassengerStackPtr pop(PassengerStackPtr* topPtr)
{


    PassengerStackPtr tempPtr;

    tempPtr = *topPtr;
    *topPtr = (*topPtr)->nextPtr;
    return tempPtr;
    free(tempPtr);
}

void top(PassengerStackPtr* topPtr)
{
}

void printStack(PassengerStackPtr currentPtr)
{

    if(currentPtr == NULL) {
    printf("The stack is empty.\n\n");
    } else {
    printf("The stack is:\n");
    while(currentPtr != NULL) {
        printf("%d --> ", currentPtr->rowNumber);
        printf("%c --> ", currentPtr->seat);
        printf("%s --> ", currentPtr->passengerName);
        currentPtr = currentPtr->nextPtr;
    }
    printf("NULL\n\n");
    }
}

int full(PassengerStackPtr topPtr)
{
}

int empty(PassengerStackPtr topPtr)
{

    return topPtr == NULL;
}

【问题讨论】:

  • @kaylum 谢谢!!!!有用。我很感激

标签: c linked-list stack


【解决方案1】:
newPtr->passengerName = passengersName;

这是不正确的,因为它会导致所有节点都指向同一个地址。不能使用 C 中的赋值复制字符串。您需要使用 strdupmalloc 然后 strcpy 之类的名称复制名称。

newPtr->passengerName = strdup(passengersName);

当不再需要这些字符串时,不要忘记free

【讨论】:

    猜你喜欢
    • 2011-07-29
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-16
    相关资源
    最近更新 更多