ルーレットホイールの回転をシミュレートするために循環リンクリストを作成しようとしています。私はネットを精査し、自分のロジックでロジックを実行しましたが、私のロジックに欠陥があるように思えません。私が本当に必要とするのは、二重にリンクされたリストを循環させる方法を理解することだけです。助けを前にありがとう。プログラムの目的は、乱数を生成し、その数値を循環二重リンクリストを反復することです。現在、プログラムを実行して最後の番号に反復し、残りの反復が乱数から除外された最後の番号を繰り返します。二重リンクリストを円で循環させる方法
/*
Roulette program
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
struct node{
int value;
struct node * next;
struct node * prev;
};
struct node * create_node(struct node *, int);
void print_forwards(struct node *, int);
void print_backwards(struct node *);
struct node * get_last_node(struct node *);
int main (int argc, char * argv[]) {
printf("Welcome to the game of Roulette!\n");
int rand_num;
int i;
srand(time(NULL));
rand_num = rand() % 400 + 1;
printf("\nFowards Random #: %d\n", rand_num);
// Numbers in order on a European Roulette wheel.
//0-32-15-19-4-21-2-25-17-34-6-27-13-36-11-30-8-23-10-5-24-16-33-1-20-
//14-31-9-22-18-29-7-28-12-35-3-26
struct node * the_list = NULL;
the_list = create_node(the_list, 0);
the_list = create_node(the_list, 32);
the_list = create_node(the_list, 15);
the_list = create_node(the_list, 19);
the_list = create_node(the_list, 4);
the_list = create_node(the_list, 21);
the_list = create_node(the_list, 2);
the_list = create_node(the_list, 25);
the_list = create_node(the_list, 17);
the_list = create_node(the_list, 34);
the_list = create_node(the_list, 6);
the_list = create_node(the_list, 27);
the_list = create_node(the_list, 13);
the_list = create_node(the_list, 36);
the_list = create_node(the_list, 11);
the_list = create_node(the_list, 30);
the_list = create_node(the_list, 8);
the_list = create_node(the_list, 23);
the_list = create_node(the_list, 10);
the_list = create_node(the_list, 5);
the_list = create_node(the_list, 24);
the_list = create_node(the_list, 16);
the_list = create_node(the_list, 33);
the_list = create_node(the_list, 1);
the_list = create_node(the_list, 20);
the_list = create_node(the_list, 14);
the_list = create_node(the_list, 31);
the_list = create_node(the_list, 9);
the_list = create_node(the_list, 22);
the_list = create_node(the_list, 18);
the_list = create_node(the_list, 29);
the_list = create_node(the_list, 7);
the_list = create_node(the_list, 28);
the_list = create_node(the_list, 12);
the_list = create_node(the_list, 35);
the_list = create_node(the_list, 3);
the_list = create_node(the_list, 26);
print_forwards(the_list, rand_num);
// print_backwards(the_list);
getchar();
return 0;
}
struct node * create_node(struct node * the_list, int new_value){
// Create the new node and set it value.
// Also set the next and prev. pointers to NULL.
struct node * head = (struct node *)malloc(sizeof(struct node));
head->value = new_value;
head->next = head;
head->prev = head;
struct node * temp;
temp->prev = (struct node *)malloc(sizeof(struct node));
temp = temp->prev;
temp->prev = head;
head->next = temp;
// create the new node at the front of the list.
if(the_list){
// Set the existing list's prev pointer
// to point to our new node.
the_list->prev = head;
}
// In any case, set our new node to the list.
// This will work fine if the list is empty
// because the "the_list" pointer is NULL.
head->next = the_list;
return head;
}
void print_backwards(struct node * the_list){
printf("\n-- Printing Backwards --\n");
while(the_list){
printf("%d\n",
the_list->value
);
the_list = the_list->next;
}
}
void print_forwards(struct node * the_list, int rand_num){
printf("\n-- Printing Forwards --\n");
int i;
struct node * end = get_last_node(the_list);
for(i = 0; i < rand_num; i++){
printf("%d ",
end->value
);
end = end->prev;
}
}
struct node * get_last_node(struct node * the_list){
while(the_list){
if(the_list->next == NULL){
break;
}else{
the_list = the_list->next;
}
}
return the_list;
}
コードを記載したいのですか? – Techiee
これは、これを循環リンクリストとして実現する方法がはるかに簡単です。 – Carcigenicate
円形に変換するのは簡単です。最初に、いくつかの質問があります: 'create_node'をリストの先頭や先頭に挿入したいのですか?あなたは二重にリンクされたポインタを持つノードを定義しましたが、あなたのコードの中には一意にしかリンクされていないものがありますか? –