-1

リンクリスト付きのトランプを作成するプログラムを作成しようとしています。私の挿入機能は、入力されたカード番号とそのスーツをリストの最後に追加する必要があります。私が作成したコードは、すでにセグメンテーション違反を引き起こしています。

#include <stdio.h>
#include <string.h>

struct node{
    char number;
    char suit;
    struct node *next;
    };

int insert(struct node *s, char su, char num)
{
   struct node *temp=s;
   struct node *newnode=(struct node*)malloc(sizeof(struct node));
   newnode->number=num;
   newnode->suit=su;
   while(temp->next)
   {
      temp=temp->next;
      temp->next=newnode;
   }
   return 0;
}

main()
{
   struct node *head;
   char x;
   while(1)
   {
      printf("What would you like to do?\n");
      printf("Insert: i\n");
      scanf("%s",&x);
      if(x=='i')
      {
         char su, num;
         printf("Please enter the suit\n");
         scanf("%s",&su);
         printf("Please enter the number\n");
         scanf("%s",&num);
         insert(head, su,num);
      }
   }
}
4

3 に答える 3

1
while(temp->next)
{
   temp=temp->next;
   temp->next=newnode;
}

渡されたポインターが を持っていない限り、無限ループs->next == NULLです。最初の反復では、temp is moved tos->next , then itsnext pointer is set to point tonewnode , so it's notNULL . Thentemp が移動しnewnode、そのnextポインタがnewnode-- それ自体に設定されます。

newnodeの代入をループ外に移動する必要があり、

while(temp->next)
{
   temp=temp->next;
}
temp->next=newnode;

構築時に初期化newnode->next = NULL;します。

そして電話すると

insert(head, su,num);

inは初期化されていないポインターmainheadあるため、未定義の動作を呼び出しています。

于 2012-11-13T19:59:24.983 に答える
0

他の回答はあなたのエラーを指摘していますが、作成したリストを指すようheadにする方法の問題が残ります。mainこれには 2 つの方法があります。1 つは double ポインターを使用する方法で、もう 1 つは からポインターを返す方法insertです。

ダブルポインターメソッドでinsertは、プロトタイプを持っているでしょう

int insert(struct node **s, char su, char num); 

のアドレスで呼び出されますhead:

struct node *head = NULL; // initialise to NULL, an empty list
... // get the new values for su/num
insert(&head, su, num);

これによりinsert、ヘッド変数のアドレスにアクセスし、その変数に値を設定できます。これは、リストが空の場合に実行されます。あなたはinsert次のようなことをします:

if (*s == NULL) {
    *s = newnode;
} else {
    // attach to end of list
}

ポインタリターンメソッドでinsertは、プロトタイプを持っています

struct node *insert(struct node *s, char su, char num); 

のアドレスで呼び出されますhead:

struct node *head = NULL; // initialise to NULL, an empty list
... // get the new values for su/num
head = insert(head, su, num);

このメソッドでinsertは、リストの先頭へのポインターを返します。リストが空の場合、newnode を返します。あなたはinsert次のようなことをします:

if (s == NULL) {
    s = newnode;
} else {
    // attach to end of list
}
return s;
于 2012-11-13T20:59:23.653 に答える
0

In insert() temp->next=newnode;は while ループの外にある必要があります。
また、割り当てる必要がありますnewnode->next = NULL;

また、*head は初期化されておらず、最後に? 1文字よりも多くのメモリを文字列に割り当てる必要があります(+可能なパディング)。

いいえ:char x, su, num; scanf("%s",&su);
はい:const int MAX=100; char x[MAX], su[MAX], num[MAX]; scanf("%s",su);

于 2012-11-13T19:58:50.027 に答える