改进我的链表计划

时间:2012-05-08 17:07:04

标签: c

这是一个正在运行的程序

#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;
}

上面的程序完全正常,我使用了全局指针根。 我的问题是如果我不想在这里使用全局指针根,那么我该如何维护 该列表因为每次我必须在我的push pop函数中返回list的根目录 还有其他方法可以实现同样的目标吗?

1 个答案:

答案 0 :(得分: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);

我强烈建议您修复pushtravel函数,使其对根指针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的检查。我将把它作为练习留给你。

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