2013-09-08 7 views
0

Эта программа должна позволять пользователю вводить некоторые имена (пока пользователь не захочет продолжить.), А затем отобразить эти имена в порядке возрастания. Я использовал функцию strncmp при сравнении массивов char. Но когда это выполняется, в качестве вывода указывается только первое и последнее имя списка отсортированных имен (это означает, что список был отсортирован). Но я не могу понять, почему имена между ними не отображаются. Пожалуйста, помогите мне! Спасибо.strncmp в связанном списке

#include <stdio.h> 
#include <malloc.h> 
#include <string.h> 

char name[10]; 
int place; 

struct node 
{ 
    char nm[10]; 
    struct node *next; 
}*newnode, *prev, *temp, *display, *current, *list; 

void createlist() 
{ 
    list = NULL; 
} 
; 

void insert() 
{ 
    newnode = (struct node*) malloc(sizeof(struct node)); 

    printf("Enter the Name: "); 
    scanf("%s", &name); 
    strncpy(newnode->nm, name, 10); 
    newnode->next = NULL; 

    if (list == NULL) 
    { 
    list = newnode; 
    } 
    else if (strncmp(name, list->nm, 10) < 0) 
    { 
    newnode->next = list; 
    list = newnode; 
    } 
    else 
    { 
    temp = list; 

    place = 0; 

    while (temp != NULL && place == 0) 
    { 
     if (strncmp(name, temp->nm, 10) >= 0) 
     { 
     prev = temp; 
     temp = temp->next; 
     } 
     else 
     { 
     place = 1; 
     } 
     newnode->next = prev->next; 
     prev->next = newnode; 
    } 
    } 
} 

void displayname() 
{ 
    if (list == NULL) 
    printf("\n\nList is empty"); 
    else 
    { 
    display = list; 
    while (display != NULL) 
    { 
     printf("%s\n", display->nm); 
     display = display->next; 
    } 
    } 
} 

int main() 
{ 

    char choice; 
    choice == 'y'; 

    createlist(); 
    do 
    { 
    insert(); 
    printf("Do you want to continue? "); 
    scanf("%s", &choice); 
    } while (choice = 'y' && choice != 'n'); 

    displayname(); 
} 
+1

Это не обязательно означает, что список был отсортирован. Это может означать, что список был поврежден. –

+2

Лучший способ узнать, как пройти через вашу программу, используя отладчик. Однако: не бросайте 'malloc'. – pzaenger

ответ

0

В функции вставки вы использованияКонтактная

newnode->next = prev->next; 
prev->next = newnode; 

использовать как

newnode->next = temp; 
prev->next = newnode; 

[EDIT]

Используйте функцию вставки, как это.

void insert() 
{ 
    newnode = (struct node*) malloc(sizeof(struct node)); 

    printf("Enter the Name: "); 
    scanf("%s", &name); 
    strncpy(newnode->nm, name, 10); 
    newnode->next = NULL; 

    if (list == NULL) 
    { 
     list = newnode; 
    } 
    else if (strncmp(name, list->nm, 10) < 0) 
    { 
     newnode->next = list; 
     list = newnode; 
    } 
    else 
    { 
     temp = list; 

     prev = NULL; 
     // prev is a global variable, So assign it to NULL each time, Otherwise it will keep old value. 
     while (temp != NULL) 
     { 
      if (strcmp(name, temp->nm) >= 0) 
      { 
       prev = temp; 
       temp = temp->next; 
      } 
      else 
      { 
       break; 

      } 
     } 
     newnode->next = temp; 
     prev->next = newnode; 
    } 
} 

Теперь помню одну вещь, В коде

  1. в основной() ваш делают

    выбор == 'у'; Это не присвоение. Вы должны использовать

    choice = 'y';

  2. в основном(), в сделай {}, а() ваше используют

    времени (выбор = 'у' & & выбора = 'п'!); choice = 'y' - это назначение, а не сравнение. использовать как это

    while (choice == 'y' & & choice! = 'N');

  3. в основной(), вы используете

    зсапЕ ("% s", & выбор); // выбор - это символ, вы пытаетесь создать строку (% s) здесь. Это приведет к повреждению памяти Так что используйте его так:

    choice = getche();

+0

Нет, все равно это не работает. :/ – Dee

+0

Я поставил почти весь код в [EDIT] и упомянул некоторые моменты, чтобы позаботиться. Все еще вы найдете какие-то проблемы, дайте мне знать. – surender8388

0

изменить свой еще в функции вставки на следующее:

else 
{ 
    temp = list; 
    while(temp !=NULL && strncmp(temp->nm,name,10)<0) 
    { 
     prev=temp; 
     temp=temp->next; 
    } 
    if(temp==NULL) 
     prev->next=newnode; 
    else 
    { 
     newnode->next=temp; 
     prev->next=newnode; 
    } 

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