(C++)再帰的構造体を使ったリストの処理
Posted: 2010年1月19日(火) 05:32
学校の課題です。
あらかじめ与えられた関数をつかって、リストの中身を反転させる関数reverseを作れという問題です。
とりあえず反転には成功しているようなのですが、
その後リストに数字を追加しようとしても何も追加されていない現象が起きて困っています。(削除するのは問題なし)
どこが原因なのでしょうか?
アドバイスよろしくお願いします。
==========================
あらかじめ与えられた関数をつかって、リストの中身を反転させる関数reverseを作れという問題です。
とりあえず反転には成功しているようなのですが、
その後リストに数字を追加しようとしても何も追加されていない現象が起きて困っています。(削除するのは問題なし)
どこが原因なのでしょうか?
アドバイスよろしくお願いします。
==========================
#include <stdio.h>
#include <stdlib.h>
typedef struct list{ //再帰的構造体
int data;
struct list *next;
} LIST;
LIST *head,*tail; //head:リストの先頭 tail:リストの末尾
int non=0; //指定の数字が存在するかのフラグ
//リストの中身を表示
void display_list(LIST *p) {
if(p == NULL)
printf("\nからっぽ!\n\n");
else{
printf("\n現在のリストの中身は\n\n");
printf("( %d ", p->data);
p = p->next;
while(p != NULL){
printf(", %d ", p->data);
p = p->next;
}
printf(")\n\nです\n\n");
}
}
//新規リスト作成
LIST *new_list(int x, LIST *y){
LIST *c = (LIST *)malloc(sizeof(LIST));
c->data = x;
c->next = y;
return c;
}
//リストに数字を追加
void add_list(int x){
LIST *p;
p = new_list(x, NULL);
if(head == NULL)
head = tail = p;
else{
tail->next = p;
tail = p;
}
}
//リストから数字を削除
void delete_list(int x){
LIST *p, *q;
q = p = head;
while(p != NULL && x != p->data){
q = p;
p = p->next;
}
if (p == NULL){
non=1;
return;
}
if (q == p) head = head->next;
else q->next = p->next;
free(p);
}
//2つのリストを結合
LIST *append(LIST *list1, LIST *list2){
if (list1 == NULL){
return list2;
}else{
return new_list(list1->data , append(list1->next,list2));
}
}
//リストを反転
LIST *reverse(LIST *list){
if(list==NULL) return list;
else return append(reverse(list->next) , new_list(list->data,NULL));
}
void main(){
int a,add,del;
while(1){
printf("\n\n ┌--------------------┐\n");
printf(" │ │\n");
printf(" │ コマンド │\n");
printf(" │ │\n");
printf(" │ 0 : リストの表示 │\n");
printf(" │ 1 : リストの追加 │\n");
printf(" │ 2 : リストの削除 │\n");
printf(" │ 3 : リストの反転 │\n");
printf(" │ │\n");
printf(" └--------------------┘\n\nコマンド>");
scanf("%d",&a);
if(a==0){
display_list(head);
}else if(a==1){
printf("\n追加する数字は?\n\n");
scanf("%d",&add);
add_list(add);
printf("\n%d を追加しました!",add);
}else if(a==2){
printf("\n削除する数字は?\n\n");
scanf("%d",&del);
delete_list(del);
if(non==0){
printf("\n%d を削除しました!\n\n",del);
}else if(non==1){
printf("\nその数字はリストに存在しません!");
non=0;
}
}else if(a==3){
if(head!=NULL) tail=new_list(head->data,NULL);
head=reverse(head);
printf("\n反転が完了しました");
}
}
}