好的,这是一个简单的c 中的单链表程序
struct node
{
int id;
char name[20];
int sem;
struct node *link;
};
typedef struct node* Node;
Node getnode()
{
Node temp=(Node)(malloc(sizeof(Node)));
if(temp==NULL)
printf("n Out of memory");
return temp;
}
Node ins_pos(Node first)
{
Node temp=getnode();
printf("n Enter id ");
scanf("%d",&temp->id);
printf("n Enter name ");
scanf("%s",temp->name);
printf("n Enter semester ");
scanf("%d",&temp->sem);
if(first == NULL)
{
temp->link=NULL;
return temp;
}
else
{
int pos,i;
printf("n Enter position: ");
scanf("%d",&pos);
if(pos == 1)
{
temp->link=first;
return temp;
}
else
{
Node prev=NULL,cur=first;
for(i=1; i<pos; i++)
{
if(cur==NULL)
break;
prev=cur;
cur=cur->link;
}
if(cur==NULL && i < pos)
printf("n Position invalid");
else
{
prev->link=temp;
temp->link=cur;
}
return first;
}
}
}
Node del(Node first)
{
if(first==NULL)
printf("n List is Empty ");
else
{
Node temp=first;
printf("n ID: %d was deleted",temp->id);
first=first->link;
free(temp);
}
return first;
}
void disply(Node first)
{
if(first==NULL)
printf("n List is empty");
else
{
Node cur=first;
while(cur!=NULL)
{
printf("n ID : ");
printf("%d",cur->id);
printf("n Name : ");
printf("%s",cur->name);
printf("n Semester : ");
printf("%d",cur->sem);
printf("nnn");
cur=cur->link;
}
}
}
int main()
{
Node first=NULL;
int opt;
do
{
printf("n QUEUE MENUn 1.Insert at position n 2.delete frontn 3.displayn 4.Exit nn Enter your choice : ");
scanf("%d",&opt);
switch(opt)
{
case 1 :first = ins_pos(first);
break;
case 2 :first = del(first);
break;
case 3 :disply(first);
break;
}
}while(opt!=4);
return 0;
}
插入新节点时,代码块会在malloc语句处崩溃。我怎么知道?嗯,它在询问"输入ID"之前崩溃了。那么,我做错了什么吗?
这里的另一点是,它只适用于节点中的整数字段,这里的问题可能是字符数组。
在此函数中Node getnode()
-
Node temp=(Node)(malloc(sizeof(Node)));
使用上面的malloc
,您分配的内存等于结构指针类型的Node
的大小,但这是不够的。因此,您会出现分段错误。
与其这样,不如这样写-
Node temp=malloc(sizeof(*temp)); //also there is no need of cast
这将分配等于temp
所指向的类型的大小的存储器,即等于结构的大小的大小。这是恰当的。
这里有一些错误。
malloc( sizeof( struct node ) );
否则分配的内存太少。
是否为malloc定义包含stdlib.h
,这将导致此问题(没有定义,默认为int)。
您需要使用Node temp=(Node)(malloc(sizeof(*temp)));