C言語リングチェーンテーブルの操作とジョセフ問題
リングチェーンテーブルは空のノードを取り除き,その尾のノードはヘッドノードに接続されている.
チェーンテーブルの作成、前にノードを挿入、後にチェーンテーブルを挿入、挿入、削除、長さ、検索、ジョセフの問題を求めるいくつかの操作をまとめました.
リングチェーン時計はまずこのようにしました.
次のコード:
チェーンテーブルの作成、前にノードを挿入、後にチェーンテーブルを挿入、挿入、削除、長さ、検索、ジョセフの問題を求めるいくつかの操作をまとめました.
リングチェーン時計はまずこのようにしました.
次のコード:
#include
#include
// ,
typedef struct node
{
int data;
struct node *next;
}Node, *LinkList;
// , , , , , ,
LinkList createList(LinkList L, int i) {
int data;
LinkList p, q;
if (i <= 0)return L;
L = (LinkList)malloc(sizeof(Node));
printf(" %d :", i);
scanf("%d", &data);
L->data = data;
q = L;
if (i > 1) {
for (int j = 1; j < i; j++) {
p = (LinkList)malloc(sizeof(Node));
scanf("%d", &data);
p->data = data;
q->next = p;
q = p;
}
}
q->next = L;
return L;
}
LinkList getNode(LinkList L, int data) {
LinkList p = L;
if (!L)return L;
while (p->next != L) {
p = p->next;
if (p->data == data)
return p;
}
if (p->data == data)
return p;
else return L;
}
//
LinkList addHead(LinkList L, int data) {
LinkList p = L, q;
q = (LinkList)malloc(sizeof(Node));
q->data = data;
if (!L) {
L = q;
q->next = q;
}
else {
while (p->next != L)
p = p->next;
p->next = q;
q->next = L;
L = q;
}
return L;
}
//
LinkList addTail(LinkList L, int data) {
LinkList p = (LinkList)malloc(sizeof(Node));
LinkList q = L;
p->data = data;
if (!L)
{
L = p;
p->next = L;
return L;
}
while (q->next != L)
q = q->next;
q->next = p;
p->next = L;
return L;
}
//
int getlen(LinkList L) {
int cnt = 1;
LinkList p = L;
if (!p)
return 0;
while (p->next != L) {
p = p->next;
cnt++;
}
return cnt;
}
// n , m n ,
LinkList InsertNode(LinkList L, int m, int n) {
LinkList p = L, pre = 0, newList;
newList = (LinkList)malloc(sizeof(Node));
newList->data = m;
if (!L)
return L;
if (L->data == n) {
LinkList q = L;
while (q->next != L)
q = q->next;
q->next = newList;
newList->next = L;
L = newList;
return L;
}
while (p->next != L) {
if (p->data == n)
break;
else {
pre = p;
p = p->next;
}
}
if (p->data == m) {
pre->next = newList;
newList->next = p;
}
else {
p->next = newList;
newList->next = L;
}
return L;
}
void deleteNode(LinkList *L, int m) {
LinkList p = *L, pre;
while (p->next != *L) {
if (p->data == m) {
break;
}
else {
pre = p;
p = p->next;
}
}
if (p == *L) {
LinkList q = *L;
while (q->next != *L)
q = q->next;
q->next = (*L)->next;
*L = (*L)->next;
free(p);
return;
}
if (p->data == m) {
pre->next = p->next;
free(p);
*L = pre->next;
}
}
void PrintList(LinkList L) {
LinkList p = L;
printf(" \t \t
");
if (!p)
return;
if (p->next == L) {
printf("%-4d %p\t%p
", p->data, p, p->next);//64 , 8 byte
}
else {
while (p->next != L) {
printf("%-4d %p\t%p
", p->data, p, p->next);
p = p->next;
}
printf("%-4d %p\t%p
", p->data, p, p->next);
}
printf("------------------------------------------------------------
");
}
void YueSeFu(LinkList *L, int m, int n) {
while (--m) {
*L = (*L)->next;
}
//
while (getlen(*L) != 1) {
for (int i = 0; i < n - 1; i++) {
*L = (*L)->next;
}
printf("'%d' , :
", (*L)->data);
deleteNode(L, (*L)->data);
PrintList(*L);
}
}
int main() {
LinkList L = 0;
int num1, num2;
//
//printf(" :");
//scanf("%d", &num1);
//L = createList(L, num1);
//PrintList(L);
//printf(" :");
//scanf("%d", &num1);
for (int i = 1; i <= 5; i++) {
L = addHead(L, i);
}
PrintList(L);
printf(" %d
", getlen(L));
printf(" m, n:");
scanf("%d %d", &num1, &num2);
YueSeFu(&L, num1, num2);
printf(" m n , m n:");
scanf("%d %d", &num1, &num2);
L = InsertNode(L, num1, num2);
PrintList(L);
printf(" n , n:");
scanf("%d", &num1);
L = getNode(L, num1);
PrintList(L);
printf(" n , n :");
scanf("%d", &num1);
deleteNode(&L, num1);
PrintList(L);
return 0;
}