Closed. This question is off-topic。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
                        
                        2年前关闭。
                                                                                            
                
        
我编写此代码是为了对链表执行推入和反向操作,但是推入/反向功能无法正常工作。我不知道问题出在哪里,一切似乎都很好。有人可以帮我吗?我认为链接列表的开头或函数的参数有问题。我需要声明一个指针作为参数吗?

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<malloc.h>
struct node {
    int data;
    struct node *next;
};
typedef struct node NODE;
NODE *head1 = NULL;
int flag = 1;
int choice;

void push(NODE*);
void menu();
void reverse(NODE*);
void display(NODE*);

int main() {
    do {
        menu();
        if (choice == 1) {
            push(head1);
            display(head1);
        }
        else if (choice == 2) {
            reverse(head1);
            display(head1);
        }
        else {
            break;
        }
    } while (1);


}

void push(NODE *head) { //function to create the linked list
    int choice1, flag = 1;
    do {
        NODE *new_node = (NODE*)malloc(sizeof(NODE*));
        puts("Enter new node data:");
        scanf("%d", &new_node->data);
        if (!head) {
            head = new_node;
            head->next = NULL;
        }
        else {
            new_node->next = head;
            head = new_node;
        }
        puts("Do you want to continue? Press 1:");
        fflush(stdin);
        scanf("%d", &choice1);
        if (choice1 != 1) {
            flag = 0;
        }
    } while (flag);
}

void menu() {
    puts("Enter 1 to push, 2 to reverse, anything else to exit:");
    scanf("%d", &choice);
}

void reverse(NODE *head) { //function to reverse it
    NODE *prev = NULL, *next = NULL;
    NODE *current = head;
    while (current) {
        next = current->next;
        current->next = prev;
        prev = current;
        current = next;
    }
    head = prev;
}

void display(NODE *head) {
    NODE *temp = head;
    puts("Status of the linked list:");
    for (; temp; temp = temp->next) {
        printf("%d=> ", temp->data);
    }
    puts("NULL");
}

最佳答案

此代码有很多错误。我将从一小段开始。

/* global */
NODE *head1 = NULL;

/* in main */
push(head1);

void push(NODE *head) { //function to create the linked list
    int choice1, flag = 1;
    do {
        NODE *new_node = (NODE*)malloc(sizeof(NODE*));
        puts("Enter new node data:");
        scanf("%d", &new_node->data);
        if (!head) {
            head = new_node;
            head->next = NULL;
    }


push()正在获取指向NODE的指针,先分配一些东西,然后将其分配给该指针。这只会修改push()中指针的本地副本,而不会修改head1。要修改head1,您需要返回一个指针或获取一个指向该指针的指针。

那是

void push(NODE** head)


要么

NODE* push(NODE* head)

head1 = push(head1);


同样,您正在分配sizeof(NODE*),即指针的大小(通常为8或4个字节)。这应该是sizeof(NODE)

关于c - 如何调试此代码的链表? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47812611/

10-11 15:31