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) { ... }

したがって、メイン関数では、ルート ポインターを保持するローカル変数を宣言できます。

struct node *root = NULL;

次に、たとえば を呼び出すときpushに、ルート ポインターのアドレスを渡します。

push(&root, data);

push関数と関数を修正travelして、ルート ポインターが であることに対して堅牢になるようにすることを強くお勧めします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のチェックを含めるように変更する必要もあります。私はあなたのための演習としてそれを残しておきます.rootNULL

ヘッド ポインターとテール ポインターの両方を維持することは、非常に多くのリスト トラバーサルを回避できるため、より良いアプローチになる可能性があります。

于 2012-05-08T17:15:44.223 に答える