从“结构节点”类型分配给“结构节点*”类型时,类型不兼容

问题描述

我已经写了一个代码在单链列表中插入一个节点。但这总是给我错误

从“结构节点”类型分配为“结构节点”类型时不兼容的类型

void insert(int d,int pos)
{
    int k=1;
    struct node *p,*q,*newNode;
    newNode = (struct node *)malloc(sizeof(struct node));
    if (newNode=NULL)
    {
        printf("Unable to allocate Memory");
        exit(0);
    }
    newNode->data = d;
    p = *head;
    if(pos == 1)
    {
        newNode->next=p;
        *head = newNode;
    }
    else
    {
        while((p!=NULL) && (k<pos))
        {
            k++;
            q=p;
            p = p->next;
        }
        q->next = newNode;
        newNode->next = p;
    }
}

在网上给我同样的错误p = *head;*head = newNode;

这是head

struct node {
    int data;
    struct node *next;
} *head;

解决方案吗?

解决方法

对于if语句中的入门者

if (newNode=NULL)

必须有比较而不是赋值

if ( newNode == NULL)

这些作业

p = *head;

*head = newNode;

不正确。看来你是说

p = head;

head = newNode;

这也是if语句

if(pos == 1)
{
    newNode->next=p;
    *head = newNode;
}

应更改为

if(pos == 1 || head == NULL )
{
    newNode->next=p;
    *head = newNode;
}

请注意,表示位置的参数应具有无符号整数类型。例如size_t。并且位置应该从0开始而不是1。

当函数依赖于全局变量时,例如在程序中函数依赖于全局指针head时,这也是一个坏主意。

使用带有全局指针头的方法,我将以下面的方式编写该函数,如下面的演示程序所示。

#include <stdlib.h>
#include <stdio.h>

struct node {
    int data;
    struct node *next;
} *head;

int insert( int d,size_t pos )
{
    struct node *new_node = malloc( sizeof( struct node ) );
    int success = new_node != NULL;
    
    if ( success )
    {
        struct node **current = &head;
        
        while ( *current != NULL && pos-- )
        {
            current = &( *current )->next;
        }
        
        new_node->data = d;
        new_node->next = *current;
        
        *current = new_node;
    }
    
    return success;
}

FILE * display( FILE *fp )
{
    for ( struct node *current = head; current != NULL; current = current->next )
    {
        fprintf( fp,"%d -> ",current->data );
    }
        
    fputs( "null",fp );
    
    return fp;
}

int main( void )
{
    insert( 2,10 );
    insert( 0,0 );
    insert( 1,1 );
    insert( 3,3 );
    
    putc( '\n',display( stdout ) ); 
}

程序输出为

0 -> 1 -> 2 -> 3 -> null
,

您在分配指针时取消了对指针的引用,这导致了您的问题。

p = *head中,您想要struct node *head分配给struct node *p,但是您要取消引用head,这意味着您实际上是在将struct node head分配给struct node *p。要解决此问题,请不要在语句中使用*

执行*head = newNode时是相同的,但相反。您取消引用head,这意味着您尝试将struct node *newNode分配给struct node head。此修补程序与先前的修补程序相同:省略了*