#include <stdio.h> #include <stdlib.h> typedef struct List { int data; struct List *next; }List; //创建循环单向链表n为长度 List *list_create(int n) { List *head, *p; int i; head = (List *)malloc(sizeof(List)); p = head; p->data = 1; //创建第一个结点 for (i = 2; i <= n; i++)//创建剩余结点 { p->next = (List *)malloc(sizeof(List)); p = p->next; p->data = i; } p->next = head; return head; } //打印循环链表 void list_print(List *head) { List *index; printf("%d ",head->data);//输出第一个节点 index = head->next; while (index != head) //判断是否是最后一个结点 { printf("%d ",index->data); index = index->next; } } //统计循环链表长度 int list_len(List *head) { List *index; int count = 0; index = head->next; count = 1; while (index != head); { count++; index = index->next; } printf(" %d ",count); return count; } //插入数据index插入位置,data插入数据 List *list_addnote(List *head, int index, int date) { List *p,*pNew,*q; int i = 0; p = head; while (i < index - 1) //查找结点 { p = p->next; i++; } pNew = (List *)malloc(sizeof(List));//为新结点申请空间 pNew->data = date; q = p->next; //保存插入后结点 p->next = pNew; pNew->next = q; return head; } //删除值为date的结点 List *list_delnote(List *head,int date) { List *p,*per; per = head; p = head->next; while (p->data != date) //查找结点 { per = p; //前驱结点 p = p->next; } per->next = p->next; if (p == head) //如果删除的是头结点,则头结点应指向下一个 head = head->next; free(p); return head; } // 约瑟夫环已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。 //从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数, //数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列 void list_process(List *head, int k, int m) { List *p, *q; int i = 1; p = head; while (i < k) //查找编号k的位置 { p = p->next; i++; } while (p->next != p)//判断是否只剩最后一个结点 { for (i = 1; i < m - 1; i++)//开始报数 { p = p->next; } q = p->next; //需要删除的数据 p->next = p->next->next; //将删除的空间指向转变 p = p->next; printf("%d ",q->data); free(q); } printf("%d ", p->data); //最后一个 free(p); } int main(void) { List *head; head = list_create(10); head = list_addnote(head,5,18); head = list_delnote(head,1); list_print(head); printf(" "); list_process(head, 2, 3); system("pause"); return 0; }