-1

私のプログラムの設計が正しいかどうかを知りたいだけでなく、コメント領域が本来の動作をしているかどうかを知りたいです。これらのコンパイル エラーは、おそらく私のコードのコメント セグメントに関連していると思われます。ありがとう!

  part1.c:15:6: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'insert'
  part1.c: In function 'main':
  part1.c:43:14: error: incompatible types when assigning to type 'struct point' from               type 'int'
  part1.c:49:44: error: invalid type argument of '->' (have 'struct point')
  part1.c:49:59: error: invalid type argument of '->' (have 'struct point')
  part1.c:55:5: error: incompatible type for argument 1 of 'free'
 /usr/include/stdlib.h:488:13: note: expected 'void *' but argument is of type 'struct point'






char *chars[3]= {"a","b","c"};

int nums[3]= {5,8,9};

struct point {char *letter;
                int number;
           struct point *next;};

struct point* insert(struct point list[],char *rqdLetters, int rqdNums) 
{  
     struct point *new;

     new = (struct point*)malloc(sizeof(struct point));
     if(new == NULL)
     fprintf(stderr,"error!");

     new->letter = rqdLetters;
     new->number = rqdNums; 

     new->next = head;
     head = new; 

     //not sure if i'm returning the a pointer to the start of new list
     return head;
}

int main(int argc, char **argv)                                             
{
   //not sure if i need to declare these here or in the insert 
    struct point list[3];          
    struct point *head = NULL;
    struct point *next; 
    struct point *new;

    int i;
    for (i = 0; i < 3; i++) 
    {
       //return result put back into the pointer to the start of the list
       head[i] = insert(list[i], chars[i], nums[i]);
    }

    int j;
    for(j = 0; j < 3; j++)
    {
       printf("letter %s and number %d\n", list[j]->letter, list[j]->number);
    }

    int z;
    for(z = 0; z < 3; z++)
    {
       free(list[z]);
    }

    return 0;
  }
4

1 に答える 1

1

一見すると、コードにはいくつかの問題があります。まず、変数を正しく宣言していません。

new = list;

次のようにする必要があります。

struct point* new;

関数の署名も少し疑わしいようです。データ構造へのポインターを返す場合は、次のようになります。

struct point* insert(...) { ... }

より一般的なレベルでは、リンクされたリストに関するあなたの考えは少しずれているようです。リストを表すには、ポイントの配列を保持するのではなく、リストのheadandのみを保持する必要があります。tail

通常、これらのポインターを保持するデータ構造を作成すると役立ちます。次に、この構造体をリストを操作する関数 (関数など) に渡すことができinsert()ます。

簡単な例として (未テスト):

struct node {
  struct node *next;
  char letter;
  int number;
}

struct list {
  struct node *head;
  struct node *tail;
}

/* create a new list */
struct list* list_new(void) {
  struct list *L = malloc(sizeof(struct list));
  L->head = NULL;
  L->tail = NULL;
}

/* add a new node to the list */
void list_insert(struct list *list, char in_letter, int in_number) {
  struct node *node = malloc(sizeof(struct node));
  node->letter = in_letter;
  node->number = in_number;
  node->next = NULL;

  if (list->head == NULL) {  /* empty list */
    list->head = node;
    list->tail = node;
  } else { /* append to list */
    list->tail->next = node;
    list->tail = node;
  }
}

その後、次のように使用できます。

int i;
char chars[3]= {"a","b","c"};
int nums[3]= {5,8,9};

struct list *mylist = list_new();

for (i = 0; i < 3; i++) 
{
   list_insert(mylist, chars[i], nums[i]);
}

に応答して:

...そして、挿入またはメイン内で宣言することになっているのかどうかはわかりませんが、メインで行いました

これは、変数を使用する場所と、これらの変数の意図した寿命によって異なります。上記のコメントで述べたように、スコープ ルールの理解を深めたいと思うかもしれません。

于 2012-08-01T16:40:38.147 に答える