在C中的链表的开头插入一个新节点

时间:2014-03-06 06:17:08

标签: c struct linked-list

结构如下所示:

typedef char AirportCode [4];
typedef struct node {
   AirportCode airport;
   struct node *next;
}Node;

我的功能如下:

void insertFirst(AirportCode code, Node **listPtr){
   Node *Holder = *listPtr;
   Node *newNode = (Node *)malloc(sizeof(Node));
   if (*listPtr == NULL){
    (*listPtr)->airport = code;
    (*listPtr)->next = NULL; }

   else{
    *listPtr = newNode;
    newNode->airport = code;
    newNode->next = holder; }
}

错误消息是:

incompatible types when assigning to type 'AirportCode' from type 'char *' 

此错误消息位于我分配代码值的两行上。

2 个答案:

答案 0 :(得分:1)

问题是您无法在C中分配数组。您只能初始化它们。此外,您不能将数组传递给函数 - 实际传递的是指向数组的第一个元素的指针。以下陈述

typedef char AirportCode[4];

定义AirportCode类型的char[4]类型 - 4个字符数组。在您的函数insertFirst中,您要将code类型char *分配给(*listPtr)->airport AirportCodechar[4]。这两个是不兼容的类型,因此您收到错误。

由于无法将数组传递给函数,因此您应该将指针传递给数组的第一个元素和数组长度。然后将数组复制到结构的相应成员。

以下三个声明完全相同。函数中的数组参数实际上是指向字符的指针。

void insertFirst(AirportCode code, Node **listPtr);
void insertFirst(char code[4], Node **listPtr);
void insertFirst(char *code, Node **listPtr);

此外,您不应该投射malloc的结果。不要让typedef混淆命名空间并导致混淆。在这种情况下,没有它你会更好。如果if条件*listPtr == NULLtrue,那么您将取消引用块中的空指针,这显然是一个错误。

if(*listPtr == NULL) {
    // the below statements dereference the null pointer 
    // which is an error and would cause program crash 
    // due to segfault.

    (*listPtr)->airport = code; 
    (*listPtr)->next = NULL;     
}

else块中,我假设您正在尝试在链接列表的开头添加新节点。我建议进行以下更改(感谢Jonathan Leffler)。

typedef struct node {
   char airport[4];  // no typedef. explicit array declaration.
   struct node *next;
} Node;

void insertFirst(char *code, Node **listPtr) {
    Node *oldHead = *listPtr;
    Node *newNode = malloc(sizeof(Node));

    if(newNode == NULL) {  // check for NULL
        printf("Not enough memory to allocate\n");
        return;
    }

    // if the struct member code is a string, then use strncpy to 
    // guard against buffer overrun, else use memcpy to copy
    // code to airport. this is assuming that the buffer pointed
    // to by code is never smaller than sizeof newNode->airport

    memcpy(newNode->airport, code, sizeof newNode->airport); 
    newNode->next = oldHead;

    *listPtr = newNode;  // make listPtr point to the new head
}

答案 1 :(得分:0)

基础知识就像这样

int a=10,b;

b=a

高于works Fine

对于数组

是一样的
int a[]={1,2,3};

int b[3]

b=a; ---> this wrong way

correct way is

for(i=0;i<3;i++)
{
   b[i]=a[i];
}

 OR

strcpy(b,a);

char a[4],b[4];
 gets(a);
 b=a;----->wrong assigning

 correct way
 strcpy(b,a);

有关详细信息,请查看Inserting New Node