Создание и перевернуть связанный список


Вот моя программа, которая создает односвязный список и переворачивает его:

#include<stdio.h>
#include<stdlib.h>
struct node {
    int data;
    struct node *next;
};
struct node *list=NULL;
struct node *root=NULL;
static int count=0;
struct node *create_node(int);//function to create node
void travel_list(void);
void create_list(int);
void reverse_list(void);
int main()
{
    int i, j, choice;
    printf("Enter a number this will be root of tree\n");
    scanf("%d", &i);
    create_list(i);
    printf("Enter  1 to enter more numbers \n 0 to quit\n");
    scanf("%d", &choice);
    while (choice!=0){
     printf("Enter a no for link list\n");
        scanf("%d",&i);
//  printf("going to create list in while\n");
    create_list(i);
        travel_list(); 
    printf("Enter  1 to enter more numbers \n 0 to quit\n");
    scanf("%d", &choice);
    }
    printf("reversing list\n");
     reverse_list();
     travel_list();
 }


// end of function main
void create_list (int data)
{
 struct node *t1,*t2;
 //printf("in fucntion create_list\n");
 t1=create_node(data);
 t2=list;
 if( count!=0)
 {
   while(t2->next!=NULL)
   {
   t2=t2->next;
   }
 t2->next=t1;
 count++;
 }
 else 
  {
   root=t1;
   list=t1;
   count++;
  }
}
struct node *create_node(int data)
{
    struct node *temp;
    temp = (struct node *)malloc(sizeof(struct node));
        temp->data=data;
    temp->next=NULL;
  //      printf("create node temp->data=%d\n",temp->data);
//  printf("the adress of node created %p\n",temp);
    return temp;
}
void travel_list(void )
{
 struct node *t1;
 t1=list;
 printf("in travel list\n");
 while(t1!=NULL)
 {
 printf("%d-->",t1->data);
 t1=t1->next;
 }
 printf("\n");
}
void reverse_list(void)
{
    struct node *t1,*t2,*t3;
       t1=list;
    t2=list->next;
    t3=list->next->next; 
   int reverse=0;
   if(reverse==0)
   {
    t1->next=NULL;
    t2->next=t1;
    t1=t2;
    t2=t3;
    t3=t3->next;
    reverse++;

    }


    while(t3!=NULL)
     {

     t2->next=t1;
    t1=t2;
    t2=t3;
    list=t1;
    travel_list();
    t3=t3->next;
    }
    t2->next=t1;
    list=t2;
}

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



446
4
задан 20 июня 2011 в 01:06 Источник Поделиться
Комментарии
4 ответа

#include<stdio.h>
#include<stdlib.h>
struct node {
int data;
struct node *next;
};
struct node *list=NULL;
struct node *root=NULL;
static int count=0;

Не храните данные в глобальные переменные. Это делает ваш код unreusable и труднее следовать.

struct node *create_node(int);//function to create node
void travel_list(void);
void create_list(int);
void reverse_list(void);
int main()
{
int i, j, choice;

Используя переменные, такие как I и J имеют смысл только если применяется в смысле индексов. В противном случае код становится сложнее читать. Выбор тоже не очень информативно.

    printf("Enter a number this will be root of tree\n");
scanf("%d", &i);
create_list(i);
printf("Enter 1 to enter more numbers \n 0 to quit\n");
scanf("%d", &choice);
while (choice!=0){
printf("Enter a no for link list\n");
scanf("%d",&i);

Использование последовательного вдавливания. В противном случае вещи будут ходить быстро.

//  printf("going to create list in while\n");

Не оставляйте мертвого кода в ваш код, это то, что системы управления версиями для.

    create_list(i);
travel_list();
printf("Enter 1 to enter more numbers \n 0 to quit\n");
scanf("%d", &choice);

Дежавю. Почему не предыдущий экземпляр делают то же самое сделать в цикле?

    }
printf("reversing list\n");
reverse_list();
travel_list();
}

// end of function main
void create_list (int data)

Эта функция добавляет в конец списка, оно не создает его. Использовать имена функций, которые указывают на то, что на самом деле происходит.

{
struct node *t1,*t2;

Т1 и Т2 очень неинформативные имена переменных.

 //printf("in fucntion create_list\n");
t1=create_node(data);
t2=list;
if( count!=0)

Это единственное место, где используется счетчик. Проверить, является ли список, а не значение null.

 {
while(t2->next!=NULL)
{
t2=t2->next;
}
t2->next=t1;
count++;
}
else
{
root=t1;

Вы никогда не кажется, чтобы сделать что-нибудь с корнем.

   list=t1;
count++;
}
}
struct node *create_node(int data)
{
struct node *temp;

Новый узел не очень временные

    temp = (struct node *)malloc(sizeof(struct node));
temp->data=data;
temp->next=NULL;
// printf("create node temp->data=%d\n",temp->data);
// printf("the adress of node created %p\n",temp);
return temp;
}
void travel_list(void )
{
struct node *t1;
t1=list;
printf("in travel list\n");
while(t1!=NULL)
{
printf("%d-->",t1->data);
t1=t1->next;
}
printf("\n");
}
void reverse_list(void)
{
struct node *t1,*t2,*t3;

Этот кусок кода будет намного легче следовать, если вы использовали реальные имена

       t1=list;
t2=list->next;
t3=list->next->next;

Это не для списков более трех элементов

   int reverse=0;
if(reverse==0)

Это всегда будет так, потому что вы назначены обратных = 0.

   {
t1->next=NULL;
t2->next=t1;
t1=t2;
t2=t3;
t3=t3->next;
reverse++;

Вы никогда не использовать снова вспять

    }

while(t3!=NULL)
{

t2->next=t1;
t1=t2;
t2=t3;
list=t1;
travel_list();
t3=t3->next;
}
t2->next=t1;
list=t2;
}

Моя версия reverse_list (непроверено)

struct node * reverse_list(struct node * list)
{
struct node *previous, *current;
previous = NULL;
current = list;
while(current)
{
struct node * next = current->next;
current->next = previous;
previous = current;
current = next;
}
return previous;
}

}

7
ответ дан 20 июня 2011 в 03:06 Источник Поделиться

Это моя версия на языке Си. Я повторное использование корневого узла вместо дополнительного узла, поскольку он манипулировал с в функции и не изменится глобально. Кроме того, посмотри, как я возвращаю голову, после того, как весь разворот списка. Это вполне допустимо, прохождение и возвращение структуры на функции в C, и вы можете использовать его, чтобы избавиться от глобальных переменных.

node *reverselinklist(node *root)
{
node *pre,*cur;
pre='\0';
while(root!='\0')
{
cur=root->next;
root->next=pre;
pre=root;
root=cur;

}
return pre;

}

3
ответ дан 15 января 2012 в 06:01 Источник Поделиться

Вы должны скомпилировать со всеми предупреждениями включен, например, ССЗ -стены:

review.c: In function ‘main’:
review.c:16: warning: unused variable ‘j’
review.c:34: warning: control reaches end of non-void function

Это говорит о том, что у вас есть неиспользуемые переменные и функции main() отсутствует оператор return. Вы должны исправить эти и любые другие предупреждения.

Также следует обратить внимание на форматирование кода.

2
ответ дан 20 июня 2011 в 02:06 Источник Поделиться

вот это класс LinkedList не я реализовывал с помощью шаблонов C++.
также я реализовал обратные и сортировка двусвязного списка путем сортировки слиянием

template <class T>
void LinkedList<T>::reverseList()
{
Node<T> *curr = head, *prev = head, *save = NULL;

while (curr)
{
save = curr->next;
curr->next = prev;
prev = curr;
curr = save;
}

head->next = NULL;
head = prev;
}

https://code.google.com/p/medicine-cpp/source/browse/trunk/cpp/ds/LinkedList.cpp

0
ответ дан 4 сентября 2011 в 01:09 Источник Поделиться