2014-10-09 6 views
-2

Попытка создать единый связанный список, используемый для хранения значений. Использование ранга в качестве глобального заполнителя, но с проблемой пытается распечатать значение каждый раз, когда он увеличивается.Printf из объединенного списка

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



typedef struct Skill 
{ 
    int rank; 
    struct node *nextSkill; 

}node; 

node * addSkills(node * head); 
node * createNode(node * new); 

int rank = 0; 

int main(void) 
{ 
    int x; 
    node * head = NULL; 
    for (x = 0; x < 2; x ++) 
    { 
     head = addSkills(head); 
     rank++; 
    } 
} 

node * addSkills(node * head) 
{ 
    node * newSkill = createNode(head); 
    head = newSkill; 
    return head; 
} 

node * createNode(node * new) 
{ 
    node * newNode = calloc(1,sizeof(node)); 
    if(newNode == NULL) 
    { 
     printf("Memory Allocation Error\n"); 
     exit(2); 
    } 
    newNode->rank = rank; 
    newNode->nextSkill = new; 
    return newNode; 
} 

void traverse(node * head) 
{ 
    node * conductor = head; 
    while(conductor != NULL) 
    { 
     printf("%d", conductor->rank); 
     conductor = conductor->nextSkill; 
    } 
} 

Не уверен, что мой подход к созданию связанного списка неверен, но я не могу понять почему?

+1

Просьба уточнить, в чем проблема, какой результат вы получаете и какой результат вы ожидаете, спасибо – dom0

+0

Проблема в том, что оператор printf в функции перемещения пропускается. Я ожидаю, что он будет печатать 0, затем 1. Я пытаюсь создать 2 узла с рангами 0, а затем 1. – choczy

+0

Подсказка: вы можете отредактировать свой вопрос, чтобы добавить дополнительную информацию. – dom0

ответ

0

Вы не звоните traverse. Таким образом, никакой выходной сигнал не генерируется.

+0

Я только что заметил это и чувствую себя невероятно глупо. – choczy

0

Код, который у вас есть, содержит недавно созданные узлы. Вот почему вы получаете узел для 1 перед узлом для 0. Если вы хотите добавить их, вы можете использовать:

node * addSkills(node * head) 
{ 
    node* temp = NULL; 

    if (head == NULL) 
    { 
     head = createNode(); 
     return head; 
    } 

    temp = head; 
    while (temp->nextSkill != NULL) 
    { 
     temp = temp->nextSkill; 
    } 

    node * newSkill = createNode(); 
    temp->nextSkill = newSkill; 

    return head; 
} 

node * createNode() 
{ 
    node * newNode = calloc(1,sizeof(node)); 
    if(newNode == NULL) 
    { 
     printf("Memory Allocation Error\n"); 
     exit(2); 
    } 
    newNode->rank = rank; 
    return newNode; 
} 
+0

Я вижу, что результат равен 0 1 0. Добавление узлов заставило бы его читать 0 1? – choczy

+0

@choczy, я вижу только «0 1». См. Текущий код на http://ideone.com/EXsPNT –

+0

Сделано ошибкой, см. Тот же ввод, спасибо за помощь. – choczy

0

Давайте deinfe вашу структуру данных, правильно так:

struct pointer 
      { 
      int field; 
      struct pointer *link; 
      }; 
typedef struct pointer cell; 

Чтобы создать свой связный список, эта функция работает отлично:

cell *create_my_linked_list() 
    { 

    int n; /* number of elements to type */ 
    int i; 
    int number; /*the values to input*/ 
    cell *ptr; /* tmp pointer */ 

    do 
    { 
    clrscr(); 
    cout<<"\tWhat is the length of the elements you want to create ? "; 
    cin>>n; 



    for(i=0;i<n;i++) 
     { 
     ptr=(cell*)malloc(sizeof(cell)); 
     cout<<"Type a number: "; 
     scanf("%3d",&number); 
     ptr->field=number;  
     ptr->link=head;   
     head=ptr; 
     } 
     return head; 
     } 

Для отображения связанного списка используйте эту простую функцию:

void display() 
     { 
     cell*node=head; 
     if(node==NULL) 
      { 
      cout<<" The linked list is empty !"; 
      }else 
       { cout<<" VThis is your list \n"; 
        while(node!=NULL) 
         { 
         printf("%3d",node->field); 
         node=node->link; 
         } 
       } 
      } 

Первая функция выше правильно создает связанный список, но она возвращает его. Он также предполагает, что вы знаете длину связанного списка заранее, как в случае массива. Чтобы избежать всего этого, воспользуйтесь этой функцией:

cell* create_a_linked_list_without_inverting_it() 
    { 

    cell*precedent=NULL; 

    cell*actual=NULL;  
    int datum; 
    int err; 

    do 
     { 
     cout<<" Type a number (or a letter to end) : "; 
     err=scanf("%d",&datum); 
     if(err<=0) break; 
     actual=(cell*)malloc(sizeof(cell)); 
     actual->field=datum; 
     if(precedent==NULL) 
     { 
     head=actual; 
     }else 
      { 
      precedent->link=actual; 
      } 
     precedent=actual; 
     }while(1); 
     actual->link=NULL; 
     return head; 
     } 

Надеюсь, это поможет. Begueradj :)

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