Реализация стека с использованием кругового двойного связанного списка - PullRequest
1 голос
/ 08 октября 2019

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

typedef struct node{
    int data;
    struct node *next,*prev;
}cdllnode;
cdllnode* createcdllnode(int data){
    cdllnode* newnode=(cdllnode*)malloc(sizeof(cdllnode));
    newnode->data=data;
    newnode->next=NULL;
    newnode->prev=NULL;
    return newnode;
}
cdllnode* push(cdllnode *head,cdllnode *tos,int data){
    cdllnode *newnode = createcdllnode(data);
    if(head==NULL){
        head=newnode;
        tos=head;
    }
    else{
        tos->next=newnode;
        newnode->prev=tos;
        tos=newnode;
        tos->next=head;
        head->prev=tos;
    }
    return head;

}
int pop(cdllnode *head,cdllnode *tos){
    if(head==NULL){
        printf("Empty Stack!\n");
        return INT_MIN;
    }

    int temp= tos->data;
    tos=tos->prev;
    tos->next=head;
    head->prev=tos;
    return temp;
}
void printstack(cdllnode *head,cdllnode *tos){
        if(head==NULL){
        printf("Empty Stack!\n");
        return ;
    }

    cdllnode *p=tos;
    do{
      printf("%d\n",p->data);
      p=p->prev;
    }while(p!=tos);
}

Я могу выдвинуть первый элемент, но если я попытаюсьвставив любой элемент после этого, я получаю ошибку сегментации. То же самое и в случае с функциями pop и printstack.

EDIT

Я исправил свой код. Нет необходимости использовать два указателя для доступа к списку. Этот код работает отлично.

#include<stdio.h>
#include<stdlib.h>
#include<limits.h>

typedef struct dnode{
    int data;
    struct dnode *next,*prev;
}cdllnode;

cdllnode* createcdllnode(int data){
    cdllnode* newnode=(cdllnode*)malloc(sizeof(cdllnode));
    newnode->data=data;
    newnode->next=NULL;
    newnode->prev=NULL;
    return newnode;
}

cdllnode* push(cdllnode *head,int data){
    cdllnode *newnode = createcdllnode(data);
    if(head==NULL){
        head=newnode;
    }
    else if(head->next==NULL){
        head->next=newnode;
        newnode->prev=head;
        newnode->next=head;
        head->prev=newnode;
    }
    else{
        cdllnode *p = head;
        p=head->prev;
        p->next=newnode;
        newnode->prev=p;
        newnode->next=head;
        head->prev=newnode;

    }
    return head;

}

cdllnode* pop(cdllnode *head,int *temp){
    if(head==NULL){
        printf("Empty Stack!\n");
        *temp= INT_MIN;
        return head;
    }

    if(head->next==head){
        *temp=head->data;
        head=NULL;
    }
    else{
        cdllnode *p=head->prev;
        *temp= p->data;
        p=p->prev;
        p->next=head;
        head->prev=p;
    }
    return head;
}

void printstack(cdllnode *head){
        if(head==NULL){
        printf("Empty Stack!\n");
        return ;
    }
    cdllnode *p=head;
    do{
        if(p->next== head){
            printf("%d\n",p->data);
        }
        else{
            printf("%d->",p->data);
        }

        p=p->next;
    }while(p!=head);
}

int main(){
    cdllnode *head=NULL;
    int choice,ele;

    do{
        printf("1.PUSH\t2.POP\t3.PRINT\t4.EXIT\n");
        scanf("%d",&choice);
        switch(choice){
        case 1 :{
            printf("Enter an element.\n");
            scanf("%d",&ele);
            head=push(head,ele);
            printf("Element Added!\n");
            break;
        }
        case 2:{
            head=pop(head,&ele);
            if(ele!= INT_MIN){
                printf("Popped %d from the stack.\n",ele);
                break;
            }
        }
        case 3:{
            printstack(head);
            break;
        }
        case 4:{
            break;
        }
        default : {
            choice=4;
            break;
        }
    }
}while(choice!=4);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...