对上述代码进行完善,要求 利用单向循环链表存储结构模拟此过程,按照出列的顺序输出各个人的编号。m 的初值为 20,n=7,7 个人的密码依次为 3,1,7,2,4,7,4,首先 m=6。输入数据:建立输入函数处理输入的数据,输入m的初值n,输入每个人的密码,建立单向循环链表。输出形式:建立一个输出函数,将正确的出列顺序输出。
时间: 2024-03-12 07:47:58 浏览: 14
以下是对代码的完善:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int id;
int password;
struct node *next;
} Node;
// 初始化链表
Node* initList(int n) {
Node *head = (Node*)malloc(sizeof(Node));
Node *p = head;
for (int i = 1; i <= n; i++) {
Node *newNode = (Node*)malloc(sizeof(Node));
newNode->id = i;
printf("请输入第%d个人的密码:", i);
scanf("%d", &(newNode->password));
p->next = newNode;
p = p->next;
}
p->next = head->next;
free(head);
return p->next;
}
// 删除节点
Node* deleteNode(Node *p, int m, int *count) {
while (*count != m - 1) {
p = p->next;
(*count)++;
}
Node *temp = p->next;
p->next = temp->next;
printf("%d ", temp->id);
free(temp);
(*count) = 0;
return p->next;
}
// 输出出列顺序
void outputOrder(int m, int n, Node *head) {
int count = 0;
printf("出列顺序:");
while (n > 0) {
head = deleteNode(head, m, &count);
n--;
}
printf("\n");
}
// 主函数
int main() {
int n, m;
printf("请输入人数n和报数上限m的初值:");
scanf("%d%d", &n, &m);
Node *head = initList(n);
outputOrder(m, n, head);
return 0;
}
```
完善后的代码使用单向循环链表存储结构模拟报数和删除操作。在删除节点时,利用循环将指针移动到要删除节点的前一个节点,然后进行删除操作。同时,增加了一个输出出列顺序的函数,将出列顺序输出。在主函数中,先调用初始化链表函数创建循环链表,然后调用输出出列顺序的函数,最后释放动态分配的内存。