首先我是设置的链表节点的元素包括三个:1.每个人的各自拥有的顺序(math表示)2.每个人所拥有的密码(data表示)3.指针元素指向下一个:
typedef struct node {int math; //math为人的顺序// int data; //data为人所带的密码// struct node *next; } node,*Linklist;
然后初始话是直接用的双重指针传入的函数体,当然返回值就是void了:
void Initlist(Linklist *L) { //初始化// (*L)=(Linklist)malloc(sizeof(node));(*L)->next=(*L); }
然后就是创建单循环链表,这里也是引用的双重指针(比较省事),正常的链表写法,n是人数多少:
void created(Linklist *L,int n) { //创建单循环链表// node *s,*r;r=*L;int i;while(n--) {s=(Linklist)malloc(sizeof(node));printf("请输入元素位置和密码:");scanf("%d%d",&s->math,&s->data);r->next=s;r=s;}r->next=(*L)->next; //让尾节点指向首元节点// }
下来就是最重要的链表处理环节,这里的话我是重新申请了两个节点(一个是后继节点,一个是普通节点),这里传入的是一重指针L和人数大小n,定义了m是第一个初始密码,第一个for循环就是找密码结束的哪个点的位置,后面的处理直接看图比较清晰:
void print(Linklist L,int n) {Linklist p,r; int m; //第一个开始密码// p=L; //指向头节点//r=L->next; //后驱节点// printf("请输入第一个密码:");scanf("%d",&m);printf("出列顺序:");while (n--){for (int j = 1; j < m ; j++) //循环m-1次后后继节点就是要删除的节点!!// {p = r; r = r->next;}printf("%2d", r->math); //后驱结点法只能输出后驱节点的math// p->next = r->next; //让后驱节点轮空// m = r->data; //将出列的玩家的密码设为新的密码//free(r); //释放要删除的节点// r = p->next; //重新给r节点赋值为p的前驱// } }
最后附上整个代码:
#include<stdio.h> #include<stdlib.h> typedef struct node {int math; //math为人的顺序// int data; //data为人所带的密码// struct node *next; } node,*Linklist; void Initlist(Linklist *L) { //初始化// (*L)=(Linklist)malloc(sizeof(node));(*L)->next=(*L); } void created(Linklist *L,int n) { //创建单循环链表// node *s,*r;r=*L;int i;while(n--) {s=(Linklist)malloc(sizeof(node));printf("请输入元素位置和密码:");scanf("%d%d",&s->math,&s->data);r->next=s;r=s;}r->next=(*L)->next; //让尾节点指向首元节点// } void print(Linklist L,int n) {Linklist p,r;int m; //第一个开始密码// p=L;r=L->next; //后驱节点// printf("请输入第一个密码:");scanf("%d",&m);printf("出列顺序:");while (n--){for (int j = 1; j < m ; j++) //循环m-1次后后继节点就是要删除的节点!!// {p = r; r = r->next;}printf("%2d", r->math); //后驱结点法只能输出后驱节点的math// p->next = r->next; //让后驱节点轮空// m = r->data; //将出列的玩家的密码设为新的密码//free(r); //释放要删除的节点// r = p->next; //重新给r节点赋值为p的前驱// } } int main() {int n;Linklist L;Initlist(&L);printf("请输入人数大小:");scanf("%d",&n);created(&L,n);print(L,n);return 0; }
后面加一张运行结果:
这里的话是7个人,从前往后每个人携带的密码分别为:3.1.7.2.4.8.4。
第一个开始密码是:20