2013-10-05 3 views
0

Я написал следующую программу, но проблема в функции Delete. В любом случае я пытаюсь удалить значение в первой позиции. Весь список утерян, не знаю почему. Если я попытаюсь после этого отобразятся некоторые значения мусора. Функция отлично работает для других позиций.Дважды связанный список Ошибка функции Ошибка

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

struct Student 
{ 
int rno; 
char name[20]; 
struct Student *next; 
struct Student *prev; 
}; 

void Display(struct Student *head) 
{ 
assert(head!=NULL); 

while(head!=NULL) 
{ 
    printf("%d\t%s\t",head->rno,head->name); 
    head=head->next; 
} 

} 

struct Student *Insert(struct Student *head,const int position,const int rno,const char name[]) 
    { 

//printf("%s\n",__FUNCTION__); 
struct Student *temp=(struct Student *)malloc(sizeof(struct Student));  
struct Student *traverse=head; 
int pos=position; 

if(temp==NULL) 
    exit(-1); 
temp->rno=rno; 
strcpy(temp->name,name); 
temp->next=NULL; 
temp->prev=NULL; 
// printf("%s\n",__FUNCTION__); 
    if(pos==1) 
    { 
     if(head==NULL) 
     { 
      head=temp; 
     } 
     else 
     { 
      temp->next=head; 
      head->prev=temp; 
      head=temp; 
     } 
    } 
    else 
    { 
     for(traverse=head,pos=position;traverse->next!=NULL&&pos-2!=0;traverse=traverse->next,pos--); 

     if(traverse==NULL || pos-2!=0) 
     { 
      printf("Invalid Position"); 
     } 
     else 
     { 
      temp->next=traverse->next; 
      if(temp->next!=NULL) 
       temp->next->prev=temp; 
      temp->prev=traverse; 
      traverse->next=temp; 
     }  
    } 

return head; 
} 


void DeleteAll(struct Student *head) 
{ 
struct Student *temp=head; 
while(temp->next!=NULL) 
{ 
    head=head->next; 
    free(temp); 
    temp=head; 
} 

free(temp); 
} 


void Delete(struct Student *head,int pos) 
{ 
assert(head!=NULL); 
struct Student *temp=head; 
struct Student *traverse=head; 
int position=pos; 

if(position==1) 
{ 
    if(head->next!=NULL)   
     head=head->next; 
    head->prev=NULL; 
    temp->next=NULL; 
    free(temp); 

} 
else 
{ 
    while(traverse->next!=NULL&&position-1!=0) 
    { 
     traverse=traverse->next; 
     position--; 
    } 

    if(traverse==NULL || position-1!=0) 
    { 
     printf(".............Invalid position..........\n"); 
    } 
    else 
    { 
     traverse->prev->next=traverse->next; 
     if(traverse->next) 
      traverse->next->prev=traverse->prev; 
    } 
} 
} 


    struct Student *CreateStudentList(const int no_of_students) 
{ 
struct Student *head=NULL; 
int i; 
int rno; 
char name[20]; 
for(i=0;i<no_of_students;i++) 
{ 
    printf("Enter roll number and name:"); 
    scanf("%d%s",&rno,name); 
    head=Insert(head,i+1,rno,name); 
} 
return head; 
    } 

    void SimulateDoublyLinkedList() 
    { 
struct Student *cdscpp2013=NULL; 
int no_of_students; 
int choice,rno,position; 
char name[20]; 

while(choice!=5) 
{ 
    if(NULL==cdscpp2013) 
    { 
     printf("Enter number of students:"); 
     scanf("%d",&no_of_students); 
     cdscpp2013=CreateStudentList(no_of_students); 
    } 
    else 
    { 
     printf("\nMenu Operations\nPress 1 for Insert\nPress 2 for Delete\nPress 3 for DeleteAll\nPress 4 for Display\nPress 5 for Exit\nEnter your choice:"); 
     scanf("%d",&choice); 
     switch(choice) 
     { 
      case 1: 
       printf("Enter roll number and name to ininsert:"); 
       scanf("%d%s",&rno,name); 
       printf("Enter position to insert:"); 
       scanf("%d",&position); 
       cdscpp2013=Insert(cdscpp2013,position,rno,name); 
       break; 
      case 2: 
       printf("Enter position to delete:"); 
       scanf("%d",&position); 
       Delete(cdscpp2013,position); 
       break; 
      case 3: 
       DeleteAll(cdscpp2013); 
       break; 
      case 4: 
       Display(cdscpp2013); 
       break; 
      case 5: 
       exit(1); 
      default: 
       printf("Invalid choice....Please Enter proper option....."); 
     } 
    } 
} 

} 

int main() 
{ 
SimulateDoublyLinkedList(); 
} 

ответ

2

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

В этом виде я также считаю полезным использовать указатели для указателей ... это упростит ваш код.

+0

Возможно, вы могли скопировать значения, если вызывающий абонент не может рассчитывать на обновление своего указателя на голову. –

+0

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

0

попробовать это для удаления это должно работать - как темп = головы, TEMP-> следующая = нуль сделает весь список исчезнет // только что удалили temp->next = null;

если (позиция == 1) { если (head-> следующий! = NULL)
head = head-> next; head-> prev = NULL; свободный (темп);

}

Edited -

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

cdscpp2013=Delete(cdscpp2013,position); 

вместо этого

Delete(cdscpp2013,position); 

затем измените то же самое для deletea ll - он должен работать :)

+0

Его работа в том смысле, что список не исчезает. Но первый узел не удаляет, он показывает некоторые значения мусора. – Amol

+0

Я отредактировал свой ответ ... проверьте его – sarath

+0

Его работа, но проверка моего рулона программы не равна нулю, но значение имени все равно такое же, как оно есть? – Amol

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