0
#include <stdio.h>

struct list
{ 
    int data; 
    struct list *next;
}; 

struct list *start, *end; 
void add(struct list *head, struct list *list, int data); 
void delete(struct list *head, struct list *tail); 

int main(void)
{ 
    start=end=NULL; 
    add(start, end, NULL); 
    add(start, end, NULL); 
    printf("First element: %d"); 
    delete(start, end);
    return 0; 
} 

void add(struct list *head, struct list *tail, int data)
{ 
    if(tail==NULL)
    { 
        head=tail=malloc(sizeof(struct list)); 
        head->data=data; head->next=NULL; 
    } else { 
        tail->next=malloc(sizeof(struct list)); 
        tail=tail->next; 
        tail->data=data; 
        tail->next=NULL; 
    } 
}

void delete(struct list *head, struct list *tail)
{ 
    struct list *temp; 
    if(head==tail)
    {  
        free(head); 
        head=tail=NULL;
    } else { 
        temp=head->next; 
        free(head); 
        head=temp; 
    } 
}

私は 3 の出力を返すことを目指していますが、ランダムな結果を得続けています。どんな洞察も大歓迎です

4

4 に答える 4

2

head変更したいのでtail、それらへのポインターを渡す必要があります。

すなわち

void add(struct list **head, struct list **tail, int data)
{ 
    if(*tail==NULL)
    { 
        *head = *tail = malloc(sizeof(struct list)); 
        (*head)->data = data;
        (*head)->next = NULL; 
    } else { 
        (*tail)->next = malloc(sizeof(struct list)); 
        *tail = (*tail)->next; 
        (*tail)->data = data; 
        (*tail)->next = NULL; 
    } 
}

他の関数についても同様に行います。すると頭と尻尾も関数の外で変化します。

この線

printf("First element: %d"); 

印刷するには整数が必要です-それを指定してください-printfのマニュアルページを参照してください

C プログラムで C++ のキーワードを使用しないでください。delete

于 2013-09-12T03:59:36.753 に答える
1

ここには多くの問題があります。

まず、関数にポインターを渡す場合、ポインターは値によって渡されます。呼び出された関数のポインターへの変更は、呼び出し元の関数には反映されません。呼び出し元の関数のポインターが指すものを変更するには、ポインターからポインターへのパスを渡す必要があります。したがって、add()関数は次のようにする必要があります。

void add(struct list **head, struct list **tail, int data) { 
    if(*tail == NULL) { 
        *head = *tail = malloc(sizeof(struct list)); 
        (*head)->data = data; 
        (*head)->next = NULL; 
    } 
    else { 
        (*tail)->next = malloc(sizeof(struct list)); 
        (*tail) = (*tail)->next; 
        (*tail)->data = data; 
        (*tail)->next = NULL; 
    } 
    return;
}

また、delete()関数も同様に変更する必要があります。

次に、データ値として NULL を add 関数に渡しています。NULL はポインタです。通常はマクロとして定義され(void*) 0、実装に含まれている可能性があります。整数として使用しないでください。0NULL ではなく、整数として渡します。

3 番目に、次のステートメントがあります。

printf("First element: %d");

フォーマット文字列には変換指定子%dがありますが、%d. これは未定義の動作です。正確に印刷しようとしている整数は何ですか?

出力はどこにあると予想さ3れますか?また、その理由は何ですか?

于 2013-09-12T04:07:16.950 に答える