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; }