0

リストを初期化し、それに n 個の要素を追加する簡単なプログラムがあります。問題は、次の n-1 要素を追加できないことです (最初の要素でリストを初期化するだけです)。条件をテストしたところ、問題はlast->next=elem機能にあるadd_elemようです。プログラムは次のとおりです。

#include <stdio.h>
#include <stdlib.h>

typedef struct lista {
  int val;
  struct lista *next;
} list;

void allocate(list *p) {
  printf("Alocating memory...");
  p=(list *)malloc(sizeof(list));
  if(p==NULL) {
    printf("Failed! Exiting program...");
    exit(1);
  } else printf("Done! \n");
}

void init_list(list *first, list *last) {
  printf("Insert first element value: ");
  scanf("%d", &(first->val));
  printf("Initializing list...\n");
  allocate(first);
  first->next=NULL;
  last=first;
  if(first->next==NULL && last==first) {
    printf("Done initializing! \n");
    printf("Last value: %d\n", last->val);
  }
}

void add_elem(list *elem, list *last, int i) {
  printf("Insert the %dth element value: ",i);
  scanf("%d", &elem->val);
  printf("Adding element to list...\n");
  allocate(elem);
  elem->next=NULL;
  last->next=elem;
  last=elem;
  if(elem->next==NULL && last==elem && last->next==elem) {
    printf("Done adding! \n");
    printf("Last value: %d\n", last->val);
  }
  //printf("%d\n", first->next->val);
}

void print_list(list *first) {
  printf("\nCurrent list: \n");
  list *it;
  for(it=first;it!=NULL;it=it->next) {
    printf("%d ",it->val);
  }
}

int main() {
  list first, last, elem;
  int n,i;
  printf("Insert number of elements: ");
  scanf("%d",&n);
  init_list(&first,&last);
  for(i=2;i<=n;i++) {
    add_elem(&elem,&last,i);
  }
  print_list(&first);
  return 0;
}
4

1 に答える 1

2

allocate関数内でメモリを割り当て、それをローカル変数に割り当てますp。関数が戻ったときにローカル変数への変更が保存されないため、このメモリは失われます。

また、関数でリストを非ポインターとして宣言することで既に行っているため、そのメモリを割り当てる必要もありませんmain

于 2012-12-03T14:41:31.533 に答える