2

リンク リストの各ノードにインデックス (コード)、アーティスト名、アルバム タイトルが含まれるアルバム カタログを作成しようとしています。ただし、何らかの理由で、リストを印刷しようとするたびに、各ノードに割り当てた正しいインデックスが表示されますが、表示されるアーティストとタイトルは、すべてのアイテムについて、私が入力したものになります最後のノード。つまり、1 つのノードに '1, Oasis and Definetely_Maybe' を入力し、2 番目のノードに '5, Aerosmith and Pump' を入力した場合、print_list を実行すると、次のように表示されます。

Code: 1

Artist: Aerosmith

Album: Pump

Code: 5

Artist: Aerosmith

Album: Pump

どういうわけか、最初のノードのアーティストとアルバムのタイトルが最後のノードで上書きされます。実行を終了する前に入力したノードの数に関係なく発生します。

これが非常に初心者であることは理解していますが、プログラミングを始めたばかりなので、助けていただければ幸いです。コードは次のとおりです。どうもありがとう。

 #include <stdio.h>
    #include <stdlib.h>
    #define MAX 100

    typedef struct n {int code; char *artist; char *album; struct n* next;} Node;

    void start_list (Node **first);
    Node *create_node (int code, char *art, char *alb);
    void insert_list (Node **first, Node *next);
    void print_list (Node *p);
    void exit_list (Node **p);

    int main(int argc, char *argv[])
    {
      Node *first;
      Node *new;
      int n;
      char artist[MAX];
      char album[MAX];
      start_list(&prim);
      do{
        printf("Please enter a number for the next Node or 0 to exit the list: ");
        scanf("%d",&n);
        if(n==0)break;
        printf("\nNow enter the artist's name: ");
        scanf("%s",&artist);
        printf("\nType the album tytle now: ");
        scanf("%s",&album);
        printf("\n\nCode: %d ",n);
        printf("\nArtist: %s ",artist);
        printf("\nAlbum: %s \n",album);
        new=create_node(n,artist,album);
        insert_list(&first,new);
      }while(n!=0);
      print_list (prim);
      exit_list(&prim);
      system("PAUSE");  
      return 0;
    }

    void start_list (No **prim){
      *prim=NULL;
    }  

    Node *create_node (int code, char *art, char *alb){
      Node *new;
      new=(Node*)malloc(sizeof(Node)); 
      new->code=code;
      new->artist=art;
      new->album=alb;
      new->next=NULL;
      return new;
    }

    void insert_list (Node **first, Node *new){
      new->next=*first;
      *first=new;
    }

    void print_list (Node *p){
      Node *aux=p;
      while (aux!=NULL){
        printf("\n\nCode: %d ",aux->code);
        printf("\nArtist: %s ",aux->artist);
        printf("\nAlbum: %s \n",aux->album);
        aux=aux->next;
      }
    }

    void exit_list (Node **p){
      Node *aux=*p;
      while(aux!=NULL){
        *p=(*p)->next;
        free(aux);
        aux=*p;
      }
    }
4

2 に答える 2

1
  Node* first = NULL;
  new->artist = strdup(art);
  new->album = strdup(alb);

そして exit_list でそれらを解放し、直前にfree(aux).

    free(aux->art);
    free(aux->alb);
    free(aux);
于 2013-05-03T16:52:21.923 に答える
0

create_node 関数は、メイン関数のアーティストとアルバムの配列を指すように、char ポインターのアーティストとアルバムを設定します。各反復は、これらの配列に格納されているものを書き換えるだけです。したがって、すべてのノードは同じ文字列を指し、プロセスの最後に、最後に入力された文字列が配列に含まれます。

文字列が呼び出し間で保持され、上書きされないように、新しい文字列ごとにストレージを割り当てる必要があります (たとえば、malloc またはヒープを使用する文字列関数を使用)。

于 2013-05-03T17:12:41.113 に答える