0

これは非常に単純だと思いますが、リンクされたリストは初めてで、ポインターには少し慣れていません。パラメータを簡単に渡すことができる C++ でのコーディングには慣れていますが、C ではそれほどではありません。だから物事が簡単にうまくいかないとき、私は混乱します。

私は基本的に、渡された変数を受け取り、リンクされたリストを検索するプログラム内の関数が必要です。私はそれをメインで動作させていますが、それを別の機能として持っていると頭が痛くなります。

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

int globalNum = 1; 

typedef char DATA;
struct node
{
    DATA d;
    int nodeNum;
    struct node *next;
};


main()
{
    struct node *head = NULL;
    struct node *tail = NULL;
    int nodeNum;

/*CREATE*/  
    while(globalNum <= 5)
    {
        struct node *new;
        if((new = malloc(sizeof(struct node))) == NULL) abort();

        new->next = NULL;
        new->nodeNum = globalNum;
        globalNum++;
        if(!head) head = new;
        else tail->next = new;
        tail = new;
    }


/*ACCESS*/
    struct node *access;
    access = head;
    while(access)
    {
        if(access->nodeNum != 5)
        {
            printf("%d\n", access->nodeNum);
            access = access->next;
            printf("NEXT\n");
        }
        else
        {
            printf("FOUND\n");
            return 0;
        }
        if(!access)
        {
            printf("CANNOT ACCESS\n");
            return 0;
        }
    }
}

@ 555k ダブルポインターに関するアドバイスをありがとう!アクセス コードに同様の関数を作成しましたが、リンク リスト ノードとセグメンテーション フォールトを読み取れません。検索機能はどのようにしてaccess->next場所を知ることができますか? を呼び出すときに何を渡す必要がありますsearch(&head);か?

int access(struct node *head)
{
    struct node *access;
        access = head;
    while(access)
        {
            if(access->nodeNum != 5)
            {
                printf("%d\n", access->nodeNum);
                access = access->next;
                printf("NEXT\n");
        }
        else
        {
            printf("FOUND\n");
        }
    if(!access)
        {
                printf("CANNOT ACCESS\n");
        }
    }
}
4

4 に答える 4

2

それ以外の

access = access+1;

使用する

access = access->next;

編集:

void search(struct node *head)
{
    struct node *access;
        access = head;
    while(access)
    {
            if(access->nodeNum != 5)
            {
                printf("%d\n", access->nodeNum);
                access = access->next;
                printf("NEXT\n");
             }
             else
             {
                printf("FOUND\n");
                access = access->next;
             }
             if(!access)
             {
                 printf("CANNOT ACCESS\n");
             }
     }

}

上記の関数を次のように呼び出します。

search(head);

メインから動作するはずです。

于 2013-03-18T11:43:53.670 に答える
0

関数を作成するための質問に対する答えはダブルポインターだと思いますこれを確認してください...

int globalNum = 1; 

typedef char DATA;
struct node
{
    DATA d;
    int nodeNum;
    struct node *next;
};

void Create(struct node **head, struct node **tail)
{
    while(globalNum <= 5)
    {
        struct node *new;
        if((new = malloc(sizeof(struct node))) == NULL) abort();

        new->next = NULL;
        new->nodeNum = globalNum;
        globalNum++;
        printf("\nBEFORE CREATE\nhead = %d\nnew = %d\ntail = %d", *head, new, *tail);
        if(!(*head)) *head = new;
        else (*tail)->next = new;
        *tail = new;
        printf("\nAFTER CREATE\nhead = %d\nnew = %d\ntail = %d\n", *head, new, *tail);
    }
 }
 void Access(struct node **head)
 {    
    struct node *access;
    access = *head;
    while(access)
    {
        if(access->nodeNum != 5)
        {
            printf("%d\n", access->nodeNum);
            access = access->next;
            printf("NEXT\n");
        }
        else
        {
            printf("FOUND\n");
            return 0;
        }
        if(!access)
        {
            printf("CANNOT ACCESS\n");
            return 0;
        }
    }
  }

main()
{
    struct node *head = NULL;
    struct node *tail = NULL;
    int nodeNum;

    Create(&head, &tail);

    Access(&head);
}
于 2013-03-18T12:02:44.583 に答える
0

私はあなたのために関数を書きませんが、仕様を書きます:-

// Looks for node with a specific nodeNum value in the list passed in.
// Returns a pointer to the node if found, or NULL if the node isn't there.

 struct node * findNode(structnode * listHead, int valueToFind)
{
// your code here
};

使用法:

  struct node *result;
  result = findNode(head, 5);
  if (result != NULL)
    ...
  else
    ...
于 2013-03-18T12:42:08.520 に答える
0

ライブラリファイルstdlib.hを使用する場合、ここで(関数ではなく)宣言されていない「NULL」についてはどうでしょうか #define NULL 0

于 2013-07-18T17:20:22.213 に答える