2013-03-23 3 views
-1

Я играл со связанным списком, чтобы немного привыкнуть к нему, но я не могу заставить эту небольшую программу работать. Я не знаю, что здесь не так, помогите.Одиночный список не работает

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <ctype.h> 
//Struct 
struct Node { 
    int value; 
    struct Node *next; 
}; 
typedef struct Node NODE; 

//Function Declaration 
NODE* addNode (NODE* pList, NODE* pPre, int data); 
void printList (NODE* pList); 

int main (void) 
{ 
    //Local Declaration 
    NODE *pPre; 
    NODE *pList; 

    //Statement 
    pList = addNode (pList, pPre, 10); 
    pList = addNode (pList, pPre, 20); 
    pList = addNode (pList, pPre, 30); 

    printList (pList); 
    return 0; 
} 

NODE* addNode (NODE* pList, NODE* pPre, int data) 
{ 
    //Local Declaration 
    NODE* pNew; 

    //Statement 
    if (!(pNew = (NODE*)malloc(sizeof(NODE)))) 
    { 
     printf("\aMemory overflow in insert\n"); 
     exit(1); 
    } 

    pNew->value = data; 
    if (pPre == NULL) 
    { 
     //Inserting before first node or to empty list. 
     pNew->next = pList; 
     pList = pNew; 
    } 
    else 
    { 
     pNew->next = pPre->next; 
     pPre->next = pNew; 
    } 
    return pList; 
} 
void printList (NODE* pList) 
{ 
    //Local Declaration 
    NODE* pNew; 

    //Statement 

    pNew = pList; 
    while(pNew) 
    { 
     printf("%d", pNew->value); 
     pNew = pNew->next; 

    } 
    return; 
} 

pPre - это узел-предшественник, а pList - указатель на список.

+1

'' return; ''? Вернуть что? – gongzhitaao

+0

@gongzhitaao, я не уверен, что я следую. Это функция, возвращающая 'void' - в чем проблема? –

+0

@CarlNorum, проверьте историю изменений ;-) (щелкните по метке времени после «отредактированного» индикатора) –

ответ

0

В соответствии с вашей логикой кода вы хотите, чтобы addNode() изменял pPre. Поэтому вам нужно определить pPre как указатель узла *.

Node * addNode(Node *pList, Node **pPre, int data) 

И addNode() должен возвращать pList, вы можете пропустить его.

+0

Я вижу только ее изменение внутри * pPre (как pPre -> ...), а не pPre, поэтому он должен работать как первоначально объявлено. Они могли бы объявить его с помощью Node ** ppList (и, при необходимости, других изменений) и иметь возможность напрямую изменять указатель заголовка списка вместо того, чтобы возвращать новое значение и полагаться на вызывающего абонента для его обновления ... Но это просто альтернативный подход ; работает подход pList return - с исправлением, как вы указали в конце. –

2

Вы не назначили NULL для указателей PPRE и Plist, попробуйте следующий код, он работает Годится В настоящее время

NODE *pPre=NULL; 
NODE *pList=NULL; 
+0

Этот код основан на учебнике, который я читаю. Разве мы не должны определять, что такое 'pPre'? так что компилятор знает, что это такое –

+0

NODE * pPre на самом деле struct Node * pPre из-за инструкции typedef. – Deepu

+0

Это сделало бы 'NODE * pPre'. Я думаю, что в этом весь смысл использовать 'typedef' –

Смежные вопросы