説明
スタックとキューを線形リストで「ラッピング」する問題
この動作をする
スタック push(1),push(2),push(3) pop(),pop(),pop()
をメイン関数で呼び出し「3,2,1」がしゅつりょくされればOK
キュー enqueue(1),enqueue(2),enqueue(3) dequeue(),dequeue(),dequeue()
をメイン関数で呼び出し「1,2,3」がしゅつりょくされればOK
本来ならheadのポインタを別にしなければなりませんが今回はグローバルで一つしか作っていないので分けることができません。
なので、一つのheadのポインタでスタックとキューのどっちもを実装します
ですから、先にスタック、後にキューという風にスタックが終わった後、空になるようなものです。
また、関数内でのポインタは「関接参照」をしなければメイン関数で使えないので注意が必要。
以下がコードです_____________________
// sennkei list
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int val;
struct node *next;
}Node;
Node *head = NULL;
Node* createN(int x){
Node *newnode;
newnode = (Node *)malloc(sizeof(Node));
newnode->val = x;
newnode->next = NULL;
return newnode;
}
void initL(int n){
int x,i;
Node *p;
scanf("%d",&x);
head = createN(x);
p = head;
for(i=1;i<n;i++){
scanf("%d",&x);
p->next = createN(x);
p = p->next;
}
}
void freeL(){
Node *p;
while(head!=NULL){
p = head->next;
free(head);
head = p;
}
}
void printN(Node *a){
if(a == NULL) printf("NULL\n");
else printf("%d\n",a->val);
}
void printL(){
Node *p = head;
while(p != NULL){
printf("%d ",p->val);
p = p->next;
}
printf("\n");
}
Node* getN(int n){
int i;
Node *p;
p = head;
for(i=1;i<n;i++) p = p->next;
return p;
}
int countL(){
int ret = 0;
Node *p = head;
while(p!=NULL){
p = p->next;
ret++;
}
return ret;
}
Node* searchX(int x){
Node *p;
for(p=head; p!=NULL; p=p->next){
if(p->val == x) break;
}
return p;
}
void insHead(int x){
Node *p; //1
p = createN(x); //1
p->next = head; //2
head = p; //3
}
void insMiddle(int n, int x){
int i;
Node *p,*q;
p = head; //1
for(i=1;i<n;i++){ //2
p = p->next; //2
}
q = createN(x); //3
q->next = p->next; //4
p->next = q; //5
}
void insTail(int x){
Node *p;
p = head; //1
if(p==NULL){
head = createN(x);
return;
}
while(p->next != NULL){ //2
p = p->next; //2
}
p->next = createN(x); //3
}
void delHead(){
Node *p;
p = head; //1
head = head->next; //2
free(p); //3
}
void delMiddle(int n){
int i;
Node *p,*q;
p = head; //1
for(i=1;i<n-1;i++){ //2
p = p->next; //2
}
q = p->next; //3
p->next = q->next; //4
free(q); //5
}
void delTail(){
Node *p;
p = head; //1
while(p->next->next != NULL){ //2
p = p->next; //2
}
free(p->next); //3
p->next = NULL; //4
}
void push(int x){
//ここに書く
}
int pop(){
//ここに書く
}
void enqueue(int x){
//ここに書く
}
int dequeue(){
//ここに書く
}
int main(void){
int s1,s2,s3,q1,q2,q3;
push(1); push(2); push(3); s1 = pop(); s2 = pop(); s3 = pop(); printf("%d %d %d\n",s1,s2,s3); //キュー enqueue(1); enqueue(2); enqueue(3); q1 = dequeue(); q2 = dequeue(); q3 = dequeue(); printf("%d %d %d\n",q1,q2,q3); freeL(); return 0;
}
___________________
入力
123
123
出力
321
123
となるはずです
回答2件
あなたの回答
tips
プレビュー