我有一个程序,我一直在出汗,并不断在函数insertAfter上获得分段错误。我得到了基本代码,并要求创建几个函数。我已经让他们中的大多数工作,但我不能得到insertAfter插入一个值后指定的节点。我没有在insertBefore上做过很多工作,但我假设我会有同样的问题
所以,这里是我的代码:(我已经包括头节点和创建新节点的函数)
struct lnode
{
int data;
struct lnode *next;
};
struct lheader
{
struct lnode *start;
int len;
};
struct lnode *makenode( int val )
{
struct lnode *box;
box = malloc( sizeof( struct lnode ) );
box->data = val;
box->next = NULL;
return box;
}
函数如下:
void insertAfter( struct lheader *L, struct lnode *p )
{
int pos, value;
struct lnode *nn;
struct lnode *temp;
temp = p;
printf( "What number do you want to insert? " );
scanf( "%d", &value );
printf( "Insert after which value: " );
scanf( "%d", &pos );
nn = makenode(value);
if ( L->start == NULL )
{
L->start = nn;
}
else
{
temp = L->start;
while( temp->next != NULL && temp->data != pos )
{
temp = temp->next;
}
if ( temp->data == pos )
{
nn->next = temp->next;
temp->next = nn;
printf("Value is %d: ", nn->data);
}
else
{
printf( "Value %d is not in listn", pos );
}
}
}
我想我加错地方了!
谢谢你所有的输入。我得去接孩子,回不了学校了。
这里是main函数,以及main调用的打印函数。我注释掉了一些其他的函数。
void printlist( struct lnode *front )
{
struct lnode *mov;
mov = front;
while (mov != NULL)
{
printf("%d ", mov->data);
mov = mov->next;
}
printf("n");
}
void printer( struct lheader *alist )
{
struct lnode *mov;
printf("--------------------------n");
printf("List print, len %dn", alist->len);
printlist( alist->start );
printf("--------------------------n");
}
int main()
{
struct lheader *L;
struct lnode *head, *tmp;
struct lnode *mark;
int i, x;
L = makelist();
for (i = 1; i <= 5; ++i)
{
x = rand() % 25 + 1;
printf("-- Adding -- %dn", x);
//insertFront( L, x );
insertBack( L, x, i );
printer( L );
}
printf(">>>>Value to search: ");
scanf("%d", &x);
i = isInList(L, x);
printf("I is %dn", i);
tmp = findNode(L, x);
if (tmp == NULL)
{
printf("NOPEn");
{
else
{
printf("Found node %dn", tmp->data);
{
insertAfter( L, mark );
// printer( L );
// insertBefore( L, mark );
// printer( L );
return 0;
}
我尝试了一个调试器(第一次),它说分割错误是在temp = temp->下一个在下面的代码片段:
else
{
temp = L->start;
while( temp->next != NULL && temp->data != pos )
{
temp = temp->next;
}
if ( temp->data == pos )
{
nn->next = temp->next;
temp->next = nn;
printf("Value is %d: ", nn->data);
}
else
{
printf( "Value %d is not in listn", pos );
}
}
}
您可以像这样检查上述条件:
- value:要插入的数据。
- loc:要插入数据的位置。
void insertAfter(int value,int loc)
{
struct node* newNode;
newNode=(struct node*)malloc(sizeof(struct node));
newNode->data=value;
if(head==NULL)
{
newNode->next=NULL;
head=newNode;
}
else
{
struct node* temp=head;
while(temp->next!=NULL)
{
if(temp->data==loc)
{
newNode->next=temp->next;
temp->next=newNode;
break;
}
else
{
temp=temp->next;
}
}
if(temp->next==NULL)
printf("Location not found");
}
printf("New Node inserted successfully after %d",loc);
}
插入在列表中的特定位置(节点后):
-我们可以使用以下步骤在单个链表的节点后插入一个新节点…
- 用给定的值创建一个新节点
- 检查list是否为空(head == NULL)
- 如果为空,则设置newNode→next = NULL和head = newNode。
- 如果不是空的,定义一个节点指针temp并初始化头。
- 继续移动temp到下一个节点,直到它到达我们想要插入newNode的节点(直到temp1→data等于location,这里location是我们想要插入newNode的节点值)。
- 每次检查temp是否到达最后一个节点。如果到达最后一个节点,则显示"给定节点未在列表中找到!!"无法插入!!,并终止函数。
-
最后,设置"newNode→next = temp→next"one_answers"temp→next = newNode"
void insertAfter(int value,int loc) { struct node* newNode; newNode=(struct node*)malloc(sizeof(struct node)); newNode->data=value; if(head==NULL) { newNode->next=NULL; head=newNode; } else { struct node* temp=head; while(temp->next!=NULL) { if(temp->data==loc) { newNode->next=temp->next; temp->next=newNode; break; } else { temp=temp->next; } } if(temp->next==NULL) printf("Location not found"); } printf("New Node inserted successfully after %d",loc); }
首先,你的while循环在我看来有点不对劲。
while( temp->next != NULL && temp->data != pos )
如果我没弄错的话,您正在使用pos作为要在其后面添加新节点的元素的索引。但是,这里要将其与temp节点的值进行比较。在我看来,你应该将它与迭代到下一个节点的次数进行比较。我认为你的问题就源于此。
有可能我对变量命名的解释不正确。