PrintList功能无法正常工作

时间:2017-08-14 17:27:32

标签: c list

我正在为我的课程开发一个List程序,到目前为止它似乎正常工作,唯一表现奇怪的是PrintList函数。假设我编译程序并在第一个节点中推送一个数字(例如4),然后打印列表,输出为: [4] - > [0] - > NULL ,即使我没有添加另一个节点0作为数据。如果这是一个愚蠢的问题,请提前抱歉,这是我写的代码:

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

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

typedef struct node NODE;

void PrintList(NODE *);
void Push(NODE **, int );
void Insert(NODE *, int );
void Append(NODE **, int );
void Delete(NODE **, int );
void Reverse(NODE **);

int main(){
    NODE *head, *temp;

    head=malloc(sizeof(NODE *));
    if(head==NULL){
        puts("Cannot allocate memory");
    }

    int i, t;
    int x;
    while(1){
        printf("Insert choice:\n1. Print List\n2. Push\n3. Insert\n4. 
    Append\n5. Delete\n6. Reverse\n\nEnter any other number to exit.");
        scanf("%d", &x);
        switch(x){
            case 1: 
                PrintList(head);
                break;
            case 2:
                printf("\nInsert data to push: ");
                scanf("%d", &i);

                Push(&head, i);
                PrintList(head);
                break;
            case 3:
                printf("\nInsert data to insert: ");
                scanf("%d", &i);

                printf("\nInsert data of previous node: ");
                scanf("%d", &t);

                temp=head;
                while(temp->data!=t){
                    temp=temp->next;
                }

                Insert(temp, i);
                PrintList(head);
                break;
            case 4:
                printf("\nInsert data to append: ");
                scanf("%d", &i);

                Append(&head, i);
                PrintList(head);
                break;
            case 5:
                printf("\nInsert value of node to delete: ");
                scanf("%d", &i);

                Delete(&head, i);
                PrintList(head);
                break;
            case 6:
                Reverse(&head);
                break;
            default:
                printf("\nExiting the program.");
                exit(1);
                break;
        }
    }
    return 0;
}

void PrintList(NODE *n){
    while(n!=NULL){
        printf("[%d]->", n->data);
        n=n->next;
    }
    printf("NULL\n\n");
    return;
}

void Push(NODE **headptr, int d){
    NODE *newnode;

    newnode=malloc(sizeof(NODE *));
    if(newnode==NULL){
        puts("\nCannot allocate memory\n");
    }

    newnode->next=(*headptr);
    newnode->data=d;
    (*headptr)=newnode;
    return;
}

void Insert(NODE *prev, int d){
    NODE *newnode;

    newnode=malloc(sizeof(NODE *));
    if(newnode==NULL){
        puts("\nCannot allocate memory\n");
    }

    newnode->next=prev->next;
    newnode->data=d;
    prev->next=newnode;
    return;
}

void Append(NODE **headptr, int d){
    NODE *newnode, *cursor;

    newnode=malloc(sizeof(NODE *));
    if(newnode==NULL){
        puts("\nCannot allocate memory\n");
    }

    newnode->next=NULL;
    newnode->data=d;

    if((*headptr)==NULL){
        (*headptr)=newnode;
        return;
    }
    else{
        cursor=(*headptr);
        while(cursor->next!=NULL){
            cursor=cursor->next;
        }

        cursor->next=newnode;
        return;
    }
}

void Delete(NODE **headptr, int d){
    if((*headptr)==NULL){
        puts("List is empty");
        return;
    }
    else{
        NODE *temp=NULL, *cursor;
        cursor=(*headptr);

        while(cursor->data!=d){
            temp=cursor;
            cursor=cursor->next;
        }

        temp->next=cursor->next;
        free(cursor);

        return;
    }
}

void Reverse(NODE **headptr){
    if((*headptr)==NULL){
        puts("List is empty");
        return;
    }
    else{
        NODE *prev=NULL, *current=(*headptr), *next;

        while(current!=NULL){
            next=current->next;
            current->next=prev;
            prev=current;
            current=next;
        }

        (*headptr)=prev;
        return;
    }
}

编辑:随时给我任何关于代码的建议。

2 个答案:

答案 0 :(得分:0)

两个问题

第一个是@BLUEPIXY指出的,你保留的空间大小错误:

final Key myKey = KeyFactory.createKey(kind, id);
final String safeUrlKey = KeyFactory.keyToString(myKey);

应该是

new_key = db.Key.from_path(entity, id, _app=application_id, namespace=namespace)
return str(new_key)

在第一次调用malloc(sizeof(NODE *)); /* The size of a pointer to the object */ 时,您正在分配未初始化指针的地址:

malloc(sizeof(NODE)) /* The size of the object */

答案 1 :(得分:0)

我试图改变所有

head=malloc(sizeof(NODE*));

head=malloc(sizeof(NODE));

并正确编程工作。

printf("%zu", sizeof(NODE));    // 16 B -- depends on padding
printf("%zu", sizeof(NODE*));   // 8  B -- depends on x64/x86 system

您正在初始化指针,但是您希望该指针指向NODE大小为sizeof(NODE)的对象,而不是您正在分配sizeof(NODE*),这是指针上的sizeof指针系统。如果您有64bit系统,则为8B,否则为4B。现在,您正在尝试将16B的{​​{1}}的对象存储到8B的位置,并且它具有未定义的行为。