リストを使ったキュー
Posted: 2007年11月09日(金) 17:24
こんにちは。課題の質問なのですが、リストを使ったキューの基本操作で、
data.datというファイル(「ABCDE」が入っている)から一文字ずつ読み取って、キューに格納してそのキューの内容を表示します。そしてキーボードから文字を入力する際に
・0を入力した場合、プログラム終了
・1を入力した場合、一文字Dequeueした後、Dequeueした文字とキューの内容を表示
・その他の文字を入力した場合、その文字をEnqueueした後、キューの内容を表示
というプログラムを作ったのですが・・・
#include <stdio.h>
struct queue{
char key;
struct queue *before;
} ;
struct queuehead{
struct queue *top, *rear;
} q;
init_queue(){
q.top = NULL;
q.rear = NULL;
}
int en(char c, struct queuehead *q){
struct queue *temp;
struct queue *w;
temp = (struct queue *)malloc(sizeof(struct queue));
temp->key = c;
temp->before = NULL;
w = q->rear;
if(q->top==NULL){
q->rear = temp;
q->top = temp;
}
else{
w->before = temp;
q->rear = temp;
}
}
int de(char c, struct queuehead *q){
struct queue *temp;
struct queue *w;
free(q->top);
q->top = q->top->before;
}
main()
{
init_queue();
FILE *fp1;
char c,enter;
if ((fp1 =fopen("data.dat","r"))==NULL){
printf("file open error!!\n");
exit(1);
}
while((c = fgetc(fp1))!=EOF){
en(c,&q);
}
print_queue_list( q );
while(c!='0'){
printf("\nInput data:");
scanf("%c%c",&c,&enter);
if(c=='0'){
}
else if(c=='1'){
printf("Dequeue:%c\n",*q.top);
de(c,&q);
print_queue_list( q );
}
else{
en(c,&q);
print_queue_list( q );
}
}
fclose(fp1);
return 0;
}
このプログラムを更に拡張して、その他の文字を入力した場合、その文字がキューの中にあるか探索して、中にあればその文字を消して、なければその文字をEnqueueするプログラムを作ってみたのですがエラーばかりでコンパイルすらできません;修正お願いします。探索する方法としてはキューを2個用意して予備の方に一度一文字ずつ入れていく時に違う文字がないか探索して、もう一度もとのキューに一文字ずつ戻していくという方法にしなければなりません。頭がこんがらがってしまいぐちゃぐちゃなプログラムになってしまったので、わかり難かったらまるごと修正してもらってかまいません。よろしくお願いします。
#include <stdio.h>
int i=0,j=0;
struct queue{
char key;
struct queue *before;
} ;
struct queuehead{
struct queue *top, *rear;
} q,q1;
init_queue(){
q.top = NULL;
q.rear = NULL;
}
int en(char c, struct queuehead *q){
struct queue *temp;
struct queue *w;
temp = (struct queue *)malloc(sizeof(struct queue));
if(i==0){
temp->key = c;
temp->before = NULL;
w = q->rear;
if(q->top==NULL){
q->rear = temp;
q->top = temp;
}
else{
w->before = temp;
q->rear = temp;
}
}
else if(i==1){
temp->key =c ;
temp->before = NULL;
if(q1->top==NULL){
q1->rear = temp;
q1->top = temp;
}
else{
w->before = temp;
q1->rear = temp;
}
}
else if(i==2){
temp->key = *q1->top ;
temp->before = NULL;
if(q->top==NULL){
q->rear = temp;
q->top = temp;
}
else{
w->before = temp;
q1->rear = temp;
}
}
}
int de(char c, struct queuehead *q){
struct queue *temp;
struct queue *w;
free(q->top);
q->top = q->top->before;
}
main()
{
init_queue();
FILE *fp1;
char c,enter;
if ((fp1 =fopen("data.dat","r"))==NULL){
printf("file open error!!\n");
exit(1);
}
while((c = fgetc(fp1))!=EOF){
en(c,&q);
}
print_queue_list( q );
while(c!='0'){
printf("\nInput data:");
scanf("%c%c",&c,&enter);
if(c=='0'){
}
else if(c=='1'){
printf("Dequeue:%c\n",*q.top);
de(c,&q);
print_queue_list( q );
}
else{
while(q.top='\0'){
i=1;
&c=*q.top;
en(c,&q1);
i=0;
de(c,&q);
if(c==*q.top){
free(q.top);
j=1;
q.top = q.top->before;
}
}
while(*(q.rear.before)!='\0'){
i=1;
de(c,&q1);
i=2;
en(c,&q);
}
if(j!=1){
i=0;
en(c,&q);
}
print_queue_list( q );
j=0;
}
}
fclose(fp1);
return 0;
}
data.datというファイル(「ABCDE」が入っている)から一文字ずつ読み取って、キューに格納してそのキューの内容を表示します。そしてキーボードから文字を入力する際に
・0を入力した場合、プログラム終了
・1を入力した場合、一文字Dequeueした後、Dequeueした文字とキューの内容を表示
・その他の文字を入力した場合、その文字をEnqueueした後、キューの内容を表示
というプログラムを作ったのですが・・・
#include <stdio.h>
struct queue{
char key;
struct queue *before;
} ;
struct queuehead{
struct queue *top, *rear;
} q;
init_queue(){
q.top = NULL;
q.rear = NULL;
}
int en(char c, struct queuehead *q){
struct queue *temp;
struct queue *w;
temp = (struct queue *)malloc(sizeof(struct queue));
temp->key = c;
temp->before = NULL;
w = q->rear;
if(q->top==NULL){
q->rear = temp;
q->top = temp;
}
else{
w->before = temp;
q->rear = temp;
}
}
int de(char c, struct queuehead *q){
struct queue *temp;
struct queue *w;
free(q->top);
q->top = q->top->before;
}
main()
{
init_queue();
FILE *fp1;
char c,enter;
if ((fp1 =fopen("data.dat","r"))==NULL){
printf("file open error!!\n");
exit(1);
}
while((c = fgetc(fp1))!=EOF){
en(c,&q);
}
print_queue_list( q );
while(c!='0'){
printf("\nInput data:");
scanf("%c%c",&c,&enter);
if(c=='0'){
}
else if(c=='1'){
printf("Dequeue:%c\n",*q.top);
de(c,&q);
print_queue_list( q );
}
else{
en(c,&q);
print_queue_list( q );
}
}
fclose(fp1);
return 0;
}
このプログラムを更に拡張して、その他の文字を入力した場合、その文字がキューの中にあるか探索して、中にあればその文字を消して、なければその文字をEnqueueするプログラムを作ってみたのですがエラーばかりでコンパイルすらできません;修正お願いします。探索する方法としてはキューを2個用意して予備の方に一度一文字ずつ入れていく時に違う文字がないか探索して、もう一度もとのキューに一文字ずつ戻していくという方法にしなければなりません。頭がこんがらがってしまいぐちゃぐちゃなプログラムになってしまったので、わかり難かったらまるごと修正してもらってかまいません。よろしくお願いします。
#include <stdio.h>
int i=0,j=0;
struct queue{
char key;
struct queue *before;
} ;
struct queuehead{
struct queue *top, *rear;
} q,q1;
init_queue(){
q.top = NULL;
q.rear = NULL;
}
int en(char c, struct queuehead *q){
struct queue *temp;
struct queue *w;
temp = (struct queue *)malloc(sizeof(struct queue));
if(i==0){
temp->key = c;
temp->before = NULL;
w = q->rear;
if(q->top==NULL){
q->rear = temp;
q->top = temp;
}
else{
w->before = temp;
q->rear = temp;
}
}
else if(i==1){
temp->key =c ;
temp->before = NULL;
if(q1->top==NULL){
q1->rear = temp;
q1->top = temp;
}
else{
w->before = temp;
q1->rear = temp;
}
}
else if(i==2){
temp->key = *q1->top ;
temp->before = NULL;
if(q->top==NULL){
q->rear = temp;
q->top = temp;
}
else{
w->before = temp;
q1->rear = temp;
}
}
}
int de(char c, struct queuehead *q){
struct queue *temp;
struct queue *w;
free(q->top);
q->top = q->top->before;
}
main()
{
init_queue();
FILE *fp1;
char c,enter;
if ((fp1 =fopen("data.dat","r"))==NULL){
printf("file open error!!\n");
exit(1);
}
while((c = fgetc(fp1))!=EOF){
en(c,&q);
}
print_queue_list( q );
while(c!='0'){
printf("\nInput data:");
scanf("%c%c",&c,&enter);
if(c=='0'){
}
else if(c=='1'){
printf("Dequeue:%c\n",*q.top);
de(c,&q);
print_queue_list( q );
}
else{
while(q.top='\0'){
i=1;
&c=*q.top;
en(c,&q1);
i=0;
de(c,&q);
if(c==*q.top){
free(q.top);
j=1;
q.top = q.top->before;
}
}
while(*(q.rear.before)!='\0'){
i=1;
de(c,&q1);
i=2;
en(c,&q);
}
if(j!=1){
i=0;
en(c,&q);
}
print_queue_list( q );
j=0;
}
}
fclose(fp1);
return 0;
}