2013-06-01 4 views
1

구조체 배열이 있고 각 구조체가 요소 목록으로 작동합니다. 각 구조체에 여러 객체를 추가해야하고 제대로 작동하지 않습니다.C : 구조체 배열의 요소 추가 및 제거

row_n=4 //fixed just for now 
cols_n=3 

product **t; 

t= (product **)calloc(row_n, sizeof(product *)); // array of row pointers 
for (int i= 0; i<n; i++) { 
t[i]= (product *)calloc(cols_n, sizeof(product)); // array of cols prod structs 
} 

t[1][1].type= 5; //only for testing 
t[1][1].quantity= 15; //only for testing 
list_all(t,row_n,col_n); //list all elements inside each array, its working as intended 
insert(t, 3, 6); //Trying to insert more books 
insert(t, 6, 10); 
insert(t, 9, 50); 

이것은 list_all 기능입니다 : : 내 배열과 내가이 main() 함수에서이 정의하고있어 어떻게

typedef struct object book, *list; 
struct object{ 
int type; 
int quantity; 
list next; 
}; 

이것은 :

는 구조입니다

void list_all(product **t , int size_n , int size_m) 
{ 
int i,j; 
product *p; 

for(i=0;i<size_n;i++){ 
    printf("--- row: ---: %d\n", i+1); 
    for(j=0;j<size_m;j++){ 
     printf("--- col: ---: %d\n",j+1); 
     p= &t[i][j]; 
     do { 
      printf("Book Type:%d Amount:%d\n", p->type, p->quantity); 
      p= p->next; 
     } while (p!=NULL); 
    } 
    } 
} 

여기 내 문제는 실제로 여기에 있습니다.이 삽입 기능을 수정해야합니다.

void insert(product **t, int id, int quantity) 
{ 
product *p, *aux = NULL; 
p=&t[0][0]; //doing it only in one position to test 
if((aux = malloc(sizeof(product))) == NULL) 
    printf("Memory error\n"); 
else 
{ 
    aux->type=id; 
    aux->quantity=quantity; 
    p->next = p; } 
p = aux; 
} 

도서 제거 기능이 필요하지만이 문제를 먼저 해결하고 싶습니다. 조언 해 주셔서 감사합니다.

+0

정확히 무엇이 문제입니까? 무슨 일 이니? 이해하기 위해 디버거를 사용 했습니까? –

+1

지금 당장 당신에게 말할 수 있습니다 : 당신의 객체 struct에서,'next' 필드는'list *'(리스트에 대한 포인터) 타입이어야합니다. – djf

+0

문제는 각 데이터 구조 내부의 목록에 여러 데이터를 추가하는 방법입니다. – Kibz

답변

0

오류 메시지가 무엇입니까? 당신이 코드에서

: 당신이 목록의 머리와 같은 제품을 삽입하는 방법으로

aux->next = p; 

:

p->next = p; 

이 있어야한다 보인다. 내가 t [0] [0] 여전히 이전 포인터를 가리키는 것이 아니라 목록의 시작을 가리키는 생각하기 때문에 내가 볼

+0

오류 메시지가 표시되지 않지만 모든 배열을 인쇄 할 때 [0] [0] 안에 책 목록이 비어 있습니다. 문제는 다른 곳을 가리키는 함수 안에 'p'포인터가 있다고 생각합니다. – Kibz

0

이 문제가

p->next = p; -> aux->next = p; 

//if 
    p=&t[0][0]; 

    then 

    at the end 

    t[0][0] = p; 

입니다 추가 노드가 표시되지 않습니다.