在特定节点后插入值到单链表中



我有一个程序,我一直在出汗,并不断在函数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);
}

插入在列表中的特定位置(节点后):

-我们可以使用以下步骤在单个链表的节点后插入一个新节点…

  1. 用给定的值创建一个新节点
  2. 检查list是否为空(head == NULL)
  3. 如果为空,则设置newNode→next = NULL和head = newNode。
  4. 如果不是空的,定义一个节点指针temp并初始化头。
  5. 继续移动temp到下一个节点,直到它到达我们想要插入newNode的节点(直到temp1→data等于location,这里location是我们想要插入newNode的节点值)。
  6. 每次检查temp是否到达最后一个节点。如果到达最后一个节点,则显示"给定节点未在列表中找到!!"无法插入!!,并终止函数。
  7. 最后,设置"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节点的值进行比较。在我看来,你应该将它与迭代到下一个节点的次数进行比较。我认为你的问题就源于此。

有可能我对变量命名的解释不正确。

相关内容

  • 没有找到相关文章

最新更新