2

私はしばらくの間 C でリンクされたリストを作成しようとしてきましたが、それもできました。今、私は自分のグローバルポインタ/変数をローカルのものに置き換えようとしているので、関数間で構造体を渡すことができます. 問題は、このテーマについて読めば読むほど、実験すればするほど、頭の中でエラーや爆発が増えることです。

私のコードは少し長い (100 行) ので、それが何をどのように行っているかを説明しようと思います。

私は構造体を発表しました:

struct node {
    char Name[21];
    struct node *Next;
};

また、関数の前に構造体へのポインターを発表しました。

struct node *global;

*global はグローバル ポインタですね。

これで、リンクされたリストを処理する新しいポインターを内部に持つ 3 つの関数ができました。

void add(void); //add nodes to list with *global, *pointer and *last
    struct node *pointer *last;
void print(void); //print node inside the list with *global and *pointer
    struct node *pointer;
void quit(void); //free malloc'd list using *global and *pointer
    struct node *pointer;

ここで、関数から別の関数に構造を渡していないことは明らかです。関数内のローカル ポインターにグローバル *global を割り当てているだけですが、これは正常に動作しますが、私が学ぼうとしているものではありません。

私は自分の問題に対する答えを探していましたが、どうやらCの基本に大きな何かが欠けているようです.

それで、私はここで何をするべきですか?どうすれば移動できますか

struct node *global;

たとえば、メイン関数内にリンクされたリストを作成し、そこから関数 add、print、quit に渡すことができます。そして、これらの関数からこのリストを返すにはどうすればよいですか?

また、元の構造体はコードの先頭にあるはずですか、それともグローバル ポインター/変数を避けるために各関数内で再度作成する必要がありますか?

4

3 に答える 3

1

struct node* global はグローバル ポインターですね。

はい、ポインターはプログラム全体で使用できます。

struct node *global; を移動するにはどうすればよいですか。

たとえば、メイン関数内にリンクされたリストを作成し、そこから関数 add、print、quit に渡すことができます。そして、これらの関数からこのリストを返すにはどうすればよいですか?

2 つ星のポインターを使用する必要があります。これを示す疑似コードを次に示します。

struct listNode {                                      
   char data;
   struct listNode *nextPtr; // pointer to next node
};


void insert(**localptr,char item);
void remove(**localptr,char item);


int main()
{
 listnode * startptr;
 ..
 insert(&startptr,'a');
 ..
 ..
 remove(&startptr,'b');
 ..

}

insert()/remove() の実装では、開始アドレスを取得してリストをナビゲートし、ノードを見つけた後、次および前のポインターのバックアップを取得し、ノードを追加または削除してから復元する必要があります前のポインタと次のポインタ

上記のコードでは、開始ポインターが main() でローカルに作成され、アドレスが insert()/remove() で二重スター ポインターに渡されるため、グローバル ポインターが不要になります。

于 2013-03-03T13:20:11.143 に答える
0

基本的な考え方は、すべてのグローバルポインタを引数として関数に渡すことです。たとえばadd

void add(node *ptr, node *last);

グローバル変数がなくなるまで、すべての関数でこれを実行します。

于 2013-03-03T13:13:56.607 に答える
0

次のように、リンクリストに別の構造体を定義してみてください。

struct node
{
     type value;
     node * next;
}
struct linkedList
{
    node * first;
}

void add(linkedlist a,type data){
 node * newNode ;
 newNode->value = data;
 newNode->next = a->first;
 a->first = newNode;
}

等々...

次に、リンクされたリストを操作します

  void main()
 {
    linkedlist a;
    type x= somevalue;
    add(a,somevalue);

}
于 2013-03-03T13:20:50.317 に答える