2010-08-13 2 views
1

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

Мой вопрос в том, является ли следующий код действительно круговым связанным списком?

// Program of circular linked list 
#include <stdio.h> 
#include <malloc.h> 

struct node 
{ 
    int info; 
    struct node *link; 
}*last; 

main() 
{ 
    int choice,n,m,po,i; 
    last=NULL; 
    while(1) 
    { 
     printf("1.Create List\n"); 
     printf("2.Add at begining\n"); 
     printf("3.Add after \n"); 
     printf("4.Delete\n"); 
     printf("5.Display\n"); 
     printf("6.Quit\n"); 
     printf("Enter your choice : "); 
     scanf("%d",&choice); 

     switch(choice) 
     { 
     case 1: 
      printf("How many nodes you want : "); 
      scanf("%d",&n); 
      for(i=0; i < n;i++) 
      { 
       printf("Enter the element : "); 
       scanf("%d",&m); 
       create_list(m); 
      } 
      break; 
     case 2: 
      printf("Enter the element : "); 
      scanf("%d",&m); 
      addatbeg(m); 
      break; 
     case 3: 
      printf("Enter the element : "); 
      scanf("%d",&m); 
      printf("Enter the position after which this element is inserted : "); 
      scanf("%d",&po); 
      addafter(m,po); 
      break; 
     case 4: 
      if(last == NULL) 
      { 
       printf("List underflow\n"); 
       continue; 
      } 
      printf("Enter the number for deletion : "); 
      scanf("%d",&m); 
      del(m); 
      break; 
     case 5: 
      display(); 
      break; 
     case 6: 
      exit(0); 
     default: 
      printf("Wrong choice\n"); 
     }/*End of switch*/ 
    }/*End of while*/ 
}/*End of main()*/ 

create_list(int num) 
{ 
    struct node *q,*tmp; 
    tmp= malloc(sizeof(struct node)); 
    tmp->info = num; 

    if(last == NULL) 
    { 
     last = tmp; 
     tmp->link = last; 
    } 
    else 
    { 
     tmp->link = last->link; /*added at the end of list*/ 
     last->link = tmp; 
     last = tmp; 
    } 
}/*End of create_list()*/ 

addatbeg(int num) 
{ 
    struct node *tmp; 
    tmp = malloc(sizeof(struct node)); 
    tmp->info = num; 
    tmp->link = last->link; 
    last->link = tmp; 
}/*End of addatbeg()*/ 

addafter(int num,int pos) 
{ 

    struct node *tmp,*q; 
    int i; 
    q = last->link; 
    for(i=0; i < pos-1; i++) 
    { 
     q = q->link; 
     if(q == last->link) 
     { 
      printf("There are less than %d elements\n",pos); 
      return; 
     } 
    }/*End of for*/ 
    tmp = malloc(sizeof(struct node)); 
    tmp->link = q->link; 
    tmp->info = num; 
    q->link = tmp; 
    if(q==last) /*Element inserted at the end*/ 
     last=tmp; 
}/*End of addafter()*/ 

del(int num) 
{ 
    struct node *tmp,*q; 
    if(last->link == last && last->info == num) /*Only one element*/ 
    { 
     tmp = last; 
     last = NULL; 
     free(tmp); 
     return; 
    } 
    q = last->link; 
    if(q->info == num) 
    { 
     tmp = q; 
     last->link = q->link; 
     free(tmp); 
     return; 
    } 
    while(q->link != last) 
    { 
     if(q->link->info == num)  /*Element deleted in between*/ 
     { 
      tmp = q->link; 
      q->link = tmp->link; 
      free(tmp); 
      printf("%d deleted\n",num); 
      return; 
     } 
     q = q->link; 
    }/*End of while*/ 
    if(q->link->info == num) /*Last element deleted q->link=last*/ 
    { 
     tmp = q->link; 
     q->link = last->link; 
     free(tmp); 
     last = q; 
     return; 
    } 
    printf("Element %d not found\n",num); 
}/*End of del()*/ 

display() 
{ 
    struct node *q; 
    if(last == NULL) 
    { 
     printf("List is empty\n"); 
     return; 
    } 
    q = last->link; 
    printf("List is :\n"); 
    while(q != last) 
    { 
     printf("%d ", q->info); 
     q = q->link; 
    } 
    printf("%d\n",last->info); 
}/*End of display()*/ 

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

ответ

4

Да, код реализует circular linked list

Переменные последний только NULL в начале, после добавления первого элемента продолжаются ссылка будет указывать на себя. См. Функцию createlist.

В некруглых списках всегда указываются последние элементы следующего указателя, равные NULL, для указания конца списка.

Редактировать: Извините, я не могу сделать искусство ascii с помощью своего ipad.

Start: 
last=NULL 

call createlist(12) 
Result: Last(12) -> Last 

call addatbeg(15) 

Result: 
tmp(15) -> Last(12 -) 
^     | 
|     | 
+----<-------<----+ 

Чтобы понять, как эти указатели работают, я бы рекомендовал сделать простой Diagramm на основе инструкций в коде. Надеюсь это поможет.

+0

Да, конечно круговой. Точка, в которой ее наиболее очевидно, находится в 'addafter', где она проверяет' if (q == last-> link) 'вместо' if (q == NULL) ', чтобы определить, закончилось ли из элементов списка. – torak

+0

@torak & @stacker: какое значение будет иметь значение (tmp-> link = last-> link) в функции addatbeg, указывает ли он на первый узел в списке? Также, что будет q указывать на (q = last-> link), бит путают необходимые объяснения ... – Tony

+0

@Tuhin Я отредактирую сообщение позже, это невозможно прямо сейчас – stacker

0

Я не тщательно изучал детали, но похоже, что это действительно связанный список. Что касается круговой связанный список, я не сталкивался с этим раньше.

Проверка на NULL проверяет, имеет ли узел следующий узел. Если это не так (NULL), то это последний узел.

+0

A * круговой связанный список * - это нормальный связанный список, в котором нет * последнего * узла или «последний узел указывает на первый узел», так сказать. Вы просто держите указатель на * любой * узел в списке и повторяете, пока не вернетесь туда, где вы начали. –

+0

@Nikolai N Fetissov: Да точно! Но здесь, в этом списке, последний узел должен всегда указывать на голову, а проверяется, что погода последнего узла равна NULL или нет. Надеюсь, вы поймете, что я имею в виду. в круговом списке нет смысла использовать NULL ... Я думаю, что приведенный выше код является простым односвязным списком или, скорее, изменяет одноуровневый список – Tony

+0

@Tuhin, когда список пуст, ваш указатель 'NULL', поэтому вы должны проверить это. –

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

  • Нет связанных вопросов^_^