0

良い一日。cでリンクリストを使用して次のデータと前のデータを作成する方法を知っている人はいますか? リンクされたリストで前のデータを取得した後、NULL 値を取得しています。右のキーに移動すると (取得したいインデックスを渡す)、次のデータの取得に問題はありませんが、キーを左に移動すると、再度インデックスを渡して必要なデータを取得しても NULL 値です。これが私のサンプルの add と get リンク リストのコードです。

typedef struct samp{
int idx;
char *name;
struct samp *next;
}sampLink;



sampLink *head=NULL,tail=NULL,test;
int addList(int idx,char *name){
  sampLink *tryi=NULL;
  tryi=(sampLink*)calloc(1,sizeof(sampLink));
  tryi->idx=idx;
  tryi->name=strdup(name);
  tryi->next=NULL;

  if(head==NULL){
    head=tryi;
    tail=tryi;
  }else{
    tail->next=tryi;
    tail=tail->next;
  }
  return 0;
}

sampLink *getList(int idx){
do{
    if(idx==head->idx){
      return head;
    }
    head=head->next;
  }while(head!=NULL);
  return head;
}

moveRightの場合

void moveRight(){
int i=0;
test=getList(i);
i++;
}

左だけマイナス記号。誰かが私を助けてくれることを願っています.Thanks

4

2 に答える 2

1

あなたが何を達成しようとしているのかについて、あなたの質問からはあまり明確ではありません。それでも、以下にいくつかの指針を見つけることができます。

  1. リンクされたリストの「先頭」へのポインターを常に維持することを常にお勧めします。ただし、moveRight 関数でそれを変更し続けます。
  2. シームレスに左右に移動したい場合は、双方向リンクリストを実装するのが最善です。

現在の単一リンク リスト ソリューションでは、getList の以下のコードを試すことができます。

sampLink *getList(int idx)
{ 
  sampLink *temp = head;
  do{     
       if(idx==temp->idx)
       {       
         return temp;     
       }     
      temp=temp->next;   

    }while(temp!=NULL);   //Now, the function only keeps modifying the temp pointer rather than the head pointer, so each time you call the function, if idx is valid, it will return a pointer.

 return NULL; //If you had encountered a node which is having idx, you would have returned in the loop itself, so returning NULL here.
}
于 2012-05-29T08:22:16.387 に答える
1

あなたが本当に左/右の動きを達成しようとしているなら、マイナスを追加するだけではうまくいきません. 両方向に移動できるようにするには、双方向にリンクされたリストを実装する必要があります。

左に移動すると NULL が返される可能性があります。これは、右に移動するときにヘッド ポインターを変更し、ヘッド ポインターを変更するとノードが失われるためです。ヌル)。

于 2012-05-29T07:46:30.877 に答える