Я хочу реализовать стек, используя круговой двойной связанный список.
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);
}