Почему я получаю "предупреждение: назначение из несовместимого типа указателя"?Двойной связанный список в массиве struct - PullRequest
1 голос
/ 28 октября 2010

Я пытаюсь сделать реализацию двойного связанного списка, который подключается к массиву. Структура, которая создает массив, содержит указатель на заголовок и хвост списка.

typedef struct myStruct{
 int code;
 struct myStruct *Head;
 struct myStruct *Tail;
}myStruct;

myStruct MyArray[10];

Вот мой двойной связанный список:

struct myList
{
 int data;
 struct myList *previous;
 struct myList *next;
}head;

struct myList *start =NULL;

На следующем фрагменте кода я получаю предупреждение, которое я написал в заголовке поста

предупреждение: присвоение из несовместимого типа указателя

void add_neighbor_to_neighborList(struct neighborList *start,int code,int Data)
{ 
 struct myList *newNode = (struct myList *) malloc (sizeof(struct myList ));   /* creates a new node of the correct data size */
 newNode->data = Data;

 if (start == NULL) { /*WARNING!checks to see if the pointer points somewhere in space*/
  MyArray[code].Head=newNode; //WARNING
  newNode->previous=MyArray[code].Head;
 }
 else
 {
  MyArray[code].Tail->next=newNode; /*error: ‘struct myStruct’ has no member named ‘next’*/
  newNode->previous=MyArray[code].Tail; //WARNING
 }
 /*if (newNode == NULL){ 
  return NULL;
  }*/
 MyArray[code].Tail=newNode; //WARNING
 newNode->next=MyArray[code].Tail;  //WARNING

 //return *start;
}

Я смотрю на это так много времени, но все еще не могу найти в чем дело и что я должен исправить Если бы у вас была идея, я был бы признателен за это! Спасибо в любом случае / заранее! ;)

Ответы [ 3 ]

11 голосов
/ 28 октября 2010
Тип
MyArray[code].Head=newNode; //WARNING

MyArray[code].Head равен struct myStruct *.

newNode, тип struct myList *.

struct myStruct * и struct myList * являются указателями надва разных типа, они несовместимы, вот что говорит вам ваш компилятор.


Возможно, вы хотели, чтобы ваш struct myStruct был определен так:

typedef struct myStruct{
 int code;
 struct myList *Head;
 struct myList *Tail;
} myStruct;

Я бы посоветовал вам использовать более явные имена типов, чтобы таких ошибок не было.

Вы можете переименовать ваш struct myStruct в struct myList и переименовать struct myList в struct myNode.Потому что это то, чем они являются или кажутся.

0 голосов
/ 28 октября 2010

Вы пытаетесь присвоить указатель myList чему-то, что ожидает указатель myStruct. Вы не можете этого сделать.

A* pA;
B *pB;

pB = pA; // Can't do this without casting
0 голосов
/ 28 октября 2010

У вас есть два разных типа, myStruct и struct myList.Они не одного типа (хотя они содержат одинаковые типы в одном и том же порядке).Используйте один или другой.

Массив MyArray имеет значение myStruct s, которое содержит указатели на struct myStruct.Вы пытаетесь назначить указатель на struct myList для этих указателей.Это не одно и то же, отсюда и предупреждение.

...