2011-12-25 4 views
0

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

РЕДАКТИРОВКА: НИКАКАЯ НЕТ НИЧЕГО! Пуст

#include <stdio.h> 
#include <string.h> 
#include <ctype.h> 
#include <stdlib.h> 
struct node { 
char Number[10]; 
char FirstName[10]; 
char LastName[10]; 
char FatherName[10]; 
char Email[20]; 
char SiteName[30]; 
struct node *next; 
}; 
void print(struct node* list) 
{ 
    printf("print1"); 
     printf(list->FirstName); 
     printf("print2"); 
} 
void addNode(struct node *head) 
{ 
    struct node *current = head; 
puts("*******Now you can insert a new person****"); 
    struct node *newNode = malloc(sizeof(struct node)); 
      printf("FIRSTNAME: ");  
     gets(newNode->FirstName); 
     printf("LASTNAME: ");  
     gets(newNode->LastName); 
      printf("FATHERNAME: ");  
     gets(newNode->FatherName); 
      printf("EMAIL: ");  
     gets(newNode->Email); 
      printf("SITENAME: "); 
      gets(newNode->SiteName); 
     //create new node 

    newNode->next = 0; // Change 1 
     //check for first insertion 
     if(current->next == 0){ 
     current->next = newNode; 
     printf("added at beginning\n"); 
    } 
    else 
    { 
     //else loop through the list and find the last 
     //node, insert next to it 
    while (current->next != 0) { 
    current = current->next; 
    } 
    current->next = newNode; 
    printf("added later\n"); 
    } 
    } 
//************************************************************************* 
int main() 
{ 
    /* This won't change, or we would lose the list in memory */ 
    struct node *root; 

    /* This will point to each node as it traverses the list */ 
    struct node *conductor; 
    root = malloc(sizeof(struct node)); 
    root->next = 0; 
     addNode(root); 
    addNode(root); 
    conductor = root; 
    //********************************* 
    print(root); 
    if (conductor != 0) { 
     while (conductor->next != 0) 
     { 
      conductor = conductor->next; 
     } 
         } 
    /* Creates a node at the end of the list */ 
    conductor->next = malloc(sizeof(struct node)); 
    conductor = conductor->next; 
    if (conductor == 0) 
    { 
     printf("Out of memory"); 
     return 0; 
    } 
    /* initialize the new memory */ 
conductor = root; 
if (conductor != 0) { 
/* Makes sure there is a place to start */ 
    while (conductor->next != 0) { 
     puts(conductor->FirstName); 
puts(conductor->LastName); 
     conductor = conductor->next; 
    } 
    puts(conductor->FirstName); 
} 
    return 0; 
} 

ответ

1
gets(current->FirstName); 

current указывает на то же struct node как head, головной узел передается в addNode. Поэтому вы переписываете значения struct node, переданные в addNode, а не новый узел, созданный с помощью вышеуказанного кода.

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

Вы код также подвержен переполнениям буфера, используя gets; рассмотрите возможность использования fgets. Я также надеюсь, что FirstName, LastName и т. Д. Определены как char[] s, а не char*, поэтому у них есть память, выделенная для них, чтобы хранить строки.

+0

Спасибо, да, они определены как char [], я не знаю, что я должен делать именно так? – Nickool

+0

@nikparsa: 'fgets (newNode-> FirstName, sizeof (newNode-> FirstName), stdin);', так что в буфер не считывается больше 'char', чем размер массива. Поскольку 'newNode-> FirstName' является массивом, а не указателем, вы можете использовать' sizeof' для получения размера массива. – AusCBloke

+0

ничего мне не меняет код из get (current-> FirstName); к тому, что вы мне сказали, а также i malloc newnode first – Nickool

1

EDIT: Ваша функция печати Теперь не выводит ничего, потому что корневой узел пуст. Это то, что ваш список выглядит следующим образом:

+------+  +------------------+  +-------------------+ 
| root | ---> | first user entry | ---> | second user entry | 
+------+  +------------------+  +-------------------+ 

Итак, если вы замените

print(root); 

с

print(root->next); 

он напечатает первую запись, сделанную пользователем.


OLD ОТВЕТ: В этой строке:

gets(current->FirstName); 

вы перезаписать значение current->FirstName с новым значением. Так как current указывает на head, вы перезаписываете значение первого узла.

Чтобы это исправить, malloc первым новый узел и затем gets значения в него (в newNode, а не в current). Не забудьте выделить достаточно места для newNode->FirstName, а остальные поля, или gets, переполнит ваш буфер. Фактически, please don't use gets at all.

+0

Спасибо, хорошо, я изменюсь, но как я должен использовать malloc. У меня есть это для нового узла. Я не мог понять ваше среднее. – Nickool

+0

@nikparsa: Это зависит. В вашей структуре есть 'FirstName' и т. Д.' Char * 'или' char [...] 's? Если они являются 'char [...]' s, вы можете игнорировать мой комментарий о распределении пространства для них. – Heinzi

+0

они char [] – Nickool

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