Простой связанный список-C - PullRequest
       0

Простой связанный список-C

2 голосов
/ 06 сентября 2011

После того, как я оторвался от программирования на языке C, я снова оказался в тупике для занятий и пытаюсь наверстать упущенное, особенно в указателях.

В текущем задании мы конвертируем программу изструктура массива в простой связанный список.Чтобы освежить свою память, я попытался реализовать ее в отдельной программе, но столкнулся с проблемой.

Мой код:

struct node{
  int val;
  struct node *next;
};

typedef struct node *item;

item newNode(void); //function prototype

void main(){
    item *cur, *itemList;
    int i;

    itemList=NULL;

    for (i=0; i<=10; i++){
        cur= newNode();
        cur->val=i;
        cur->next= itemList;

    }
}

item newNode(void) {
    item box;  /* the new object to return */

    box = (item) malloc (sizeof (struct node));

    if (box == NULL) {
        printf("ERROR: emalloc failed for new Box\n");
        exit(0);
    }

    /* initialize fields */
    box->val=0;

    return box;

}

Первое сообщение об ошибке приходит на cur= newBox() и указывает, что выполняется присвоение несовместимого типа указателя.Я не уверен почему, так как cur это указатель на узел, а box это структура.Откуда исходит несовместимый указатель?

Ответы [ 4 ]

4 голосов
/ 06 сентября 2011

Первая проблема заключается в том, что вы делаете item *cur, *itemList;, что node**. Измените это на item cur, itemList;, чтобы получить node*; вам не нужен указатель на указатель на node, просто указатель на node.

Другая проблема состоит в том, что вы устанавливаете все next указатели ваших узлов на itemList без установки itemList на cur в конце каждой итерации цикла (что заставит itemList указывать на начало списка в конце цикла).

3 голосов
/ 06 сентября 2011

Вам нужен указатель

Будет понятнее, если ваш typedef будет выглядеть так:

typedef struct node item;

затем:

item *newNode(void) {
    item *box;  /* the new object to return */

    box = (item) malloc (sizeof (struct node));

    if (box == NULL) {
        printf("ERROR: emalloc failed for new Box\n");
        exit(0);
    }

    /* initialize fields */
    box->val=0;

    return box;

}

Также вы вызываете функцию newNode иnewBox в разных местах.

Вам также необходимо сбросить указатель головы:

for (i=0; i<=10; i++){
    cur= newBox();
    cur->val=i;
    cur->next= itemList;
    itemList = cur;

}
1 голос
/ 06 сентября 2011

В основном вы используете item*, что node**. Просто удалите * в списке объявлений в main.

0 голосов
/ 06 сентября 2011

cur имеет тип item*, указатель на элемент.Но тип возврата newNode(void) равен item.Они оба не совместимы по типу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...