我正在努力解决this spoj problem。
以下是我在C中解决问题的方法:
#include<stdio.h>
#include<stdlib.h>
struct node{
int data;
struct node*next;
};
struct node* head=NULL;
void insertFront(int data)
{
struct node*newnode=(struct node*)malloc(sizeof(struct node));
newnode->data=data;
newnode->next=NULL;
newnode->next=head;
head=newnode;
}
int returnSize(){
int cnt=0;
struct node*temp=head;
while(temp!=NULL)
{
cnt++;
temp=temp->next;
}
return cnt;
}
void insertAt(int position,int data)
{
struct node*newnode=(struct node*)malloc(sizeof(struct node));
newnode->data=data;
newnode->next=NULL;
if(head==NULL&&position>0)//marker1
{
head=newnode;
return;
}//marker2
int cnt=returnSize();
if(position>cnt)
{
struct node*var=head;
while(var->next!=NULL)
var=var->next;
var->next=newnode;
return;
}
int i;
struct node*temp=head;
if(position==0)
{
newnode->next=head;
head=newnode;
return;
}
else
{
for(i=0;i<position-1;i++)
{
temp=temp->next;
}
newnode->next=temp->next;
temp->next=newnode;
}
}
void deleteAt(int position)
{
if(head==NULL)
{
printf("empty");
return;
}
int i,cnt=0;
struct node*dummy=head;
while(dummy->next!=NULL)
{
cnt++;
dummy=dummy->next;
}
if(position>cnt)
return;
if(position==0)
{
struct node*temp=head;
head=head->next;
free(temp);
}
else
{
struct node*temp=head;
for(i=0;i<position-1;i++)
{
if(temp!=NULL)
temp=temp->next;
else
return;
}
temp->next=temp->next->next;
}
}
void deleteFront()
{
if(head==NULL)
{
printf("empty");
return;
}
struct node*temp=head;
head=head->next;
free(temp);
if(head==NULL)
{
printf("empty");
return;
}
}
void print()
{
struct node*temp=head;
while(temp!=NULL)
{
printf("%d ",temp->data);
temp=temp->next;
}
printf("\n");
}
int main()
{
char a;
do{
char tmp;
int b,c;
scanf("%c",&a);
if(a=='r')
{
deleteFront();
print();
}
else if(a=='i')
{
scanf("%d",&b);
scanf("%d",&c);
insertAt(b,c);
print();
}
else if(a=='f')
{
scanf("%d",&b);
insertFront(b);
print();
}
else if(a=='d')
{
scanf("%d",&b);
deleteAt(b);
print();
}
scanf("%c",&tmp);
}while(a!='q');
return 0;
}
如果我在函数marker
中以注释行的形式删除标记为insertAt()
的行,则会得到segfault
。
当我使用它们时,我得到了错误的答案。我测试了很多病例,我无法弄清楚我错在哪里。
有人可以帮帮我吗?
答案 0 :(得分:0)
首先,我建议你看一下这个问题:Do I cast the result of malloc
? ...可以说,维护的最佳模式看起来更像是这样:
-
这样,如果您必须更改foo *bar = malloc(sizeof *bar);
if (bar == NULL) {
/* handle allocation error */
}
的类型,则不太可能忘记在某处替换类型名称;如果您使用此模式,则在维护期间创建新错误的可能性会降低。
bar
在您使用newnode->next=NULL; /* <--- THIS IS UNNECESSARY */
newnode->next=head; /* <--- because this ends up being the value immediately after */
的任何地方都有潜在的空指针取消引用,而忽略它来检查其返回值。见上面的模式。
malloc
中有一个潜在的空指针取消引用,此处:insertAt
和此处:temp=temp->next;
。当newnode->next=temp->next;
为head
时,标记之间的代码会保护您的程序免受此空指针引用...但这不是唯一可能触发此空指针解除引用的情况。
NULL
中有一个潜在的空指针取消引用,这里:deleteAt
每次使用时,你都应该检查temp->next=temp->next->next;
的返回值。
为了将来参考,请修改您的制表键,以便我们可以更轻松地帮助您......如果这是我到目前为止只回答您问题的原因,我不会感到惊讶。