0

这是一个正在运行的程序

#include <stdio.h>
#include <stdlib.h>
struct node {
    int data;
    struct node *next, *prev;
};
struct node *root = NULL;
void push(int);
void pop(void);
struct node *create_node(int);
void travel(void);
int main()
{
    int i, j, choice, count;
    printf("enter choice\n");
    scanf("%d", &choice);
    count = 0;
    while (choice == 1) {
        printf("enter a data element");
        scanf("%d", &j);
        if (count == 0) {
            root = (struct node *)malloc(sizeof(struct node));
            root->next = NULL;
            root->data = j;
        } else
            push(j);
        count++;
        printf("enter choice\n");
        scanf("%d", &choice);
    }
    printf("the link list is \n");
//travel function to be created
    travel();
}

void push(int data)
{
    struct node *t1;
    t1 = root;
    while (t1->next != NULL) {
        t1 = t1->next;
    }
    t1->next = create_node(data);
}

void pop()
{
}

void travel(void)
{
    struct node *t1;
    t1 = root;
    while (t1->next != NULL) {
        printf("%d ", t1->data);
        t1 = t1->next;
    }
    printf("%d ", t1->data);
}

struct node *create_node(int data)
{
    struct node *p = (struct node *)malloc(sizeof(struct node));
    p->data = data;
    p->next = NULL;
    p->prev = NULL;
    return p;
}

上面的程序完全可以工作,我使用了一个全局指针根。我的问题是,如果我不想在这里使用全局指针根,那么我该如何维护该列表,因为每次我都必须在我的推送弹出函数中返回列表的根,还有其他方法可以实现相同的效果吗?

4

1 回答 1

2

实现这一点的最简单方法是将指向根节点的指针传递给每个函数:

void push(struct node **root, int data) { ... }
void pop(struct node **root) { ... }
void travel(struct node *root) { ... }

因此,在您的 main 函数中,您可以声明一个局部变量来保存根指针:

struct node *root = NULL;

然后当你调用时push,例如,你传递根指针的地址:

push(&root, data);

我强烈建议你修复你的pushandtravel函数,使它们对根指针是健壮的NULL。这在你之前的问题中讨论过,你应该听从建议。

如果你这样做了,那么你可以摆脱测试count为零和相关的特殊情况代码。然后,您将替换它:

if (count == 0) {
    root = (struct node *)malloc(sizeof(struct node));
    root->next = NULL;
    root->data = j;
} else
    push(&root, j);

有了这个:

push(&root, j);

为了将信息带回家,您的新push产品将如下所示:

void push(struct node **root, int data)
{
    if (*root == NULL)
        *root = create_node(data);
    else
    {
        struct node *last = *root;
        while (last->next != NULL) {
            last = last->next;
        }
        last->next = create_node(data);
    }
}

您还需要修改travel以包括对root节点的检查NULL。我会把它留给你作为练习。

同时维护头指针和尾指针可能是一种更好的方法,因为它可以避免如此多的列表遍历。

于 2012-05-08T17:15:44.223 回答