0

次のプログラムを作成しましたが、問題は削除機能にあります。最初の位置の値を削除しようとすると、リスト全体が失われます。理由はわかりません。その後リストを表示しようとすると、いくつかのガベージ値が表示されます印刷されています。機能は他の位置で完全に機能しています。

#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();
}
4

2 に答える 2

2

リストの最初の要素を削除すると、呼び出し元はリストへの参照を更新する必要があります。したがって、Delete 関数は、結果のリストの最初の要素へのポインターを返す必要があります。

この種の操作では、ポインターへのポインターを使用することも役立ちます...これにより、コードが大幅に簡素化されます。

于 2013-10-05T13:28:38.553 に答える
0

削除のためにこれを試してくださいこれはうまくいくはずです- temp = head として、 temp->next =null はリスト全体を非表示にします //ちょうど削除されましたtemp->next = null;

if(position==1) { if(head->next!=NULL)
head=head->next; head->prev=NULL; 無料(一時);

}

編集 --

ヘッドポインタを返す削除関数を作成し、スイッチの場合はこれを使用します

cdscpp2013=Delete(cdscpp2013,position);

これの代わりに

Delete(cdscpp2013,position);

次に、deleteall関数についても同じように変更します-動作するはずです:)

于 2013-10-05T13:35:21.727 に答える