我正在为我的课程开发一个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;
}
}
编辑:随时给我任何关于代码的建议。
答案 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
的位置,并且它具有未定义的行为。