循环单链表

来源:百度知道 编辑:UC知道 时间:2024/06/10 15:30:42
1、有13个人围成一圈,并给他们从小到大进行编号1-13号,从第一个人开始循环报号1、2、3。凡报到“3”者退出圈子,找出最后留在圈子中的人原来的序号。
提示:
(1) 用循环单链表实现。
(2) 可以用一个函数建立初始链表。设置好头指针和尾指针,用尾插入法形成队列,再让最后一个结点指向第一个结点,形成循环链表。
(3) 退出圈子的过程可以用循环实现。按顺序访问链表,比如用count循环报号1、2、3,用i统计已经出列的人数。
(4) count计数到3则相应的结点要出队,注意删除结点的关键在于要先找出前驱结点的地址。然后可以使count重置为1,出列人数增加1. 如果出列人数已经为12,则退出循环。
(5) 可以在程序中输出出列的顺序,以方便检查程序是否已经正确。

///v6
#include "stdio.h"
#include <stdlib.h>

enum Status{OK,ERROR};

typedef int ElemType;

typedef struct Lnode
{
ElemType num;///结点元素类型为int
Lnode *next;///指向下一结点的指针
}LNode,*LinkList;

Status CreatLink(LinkList &L,int n)///创建n个人序号的链表
{
LinkList p;
LinkList head;
L = (LinkList)malloc(sizeof(LNode));///带头结点的链表
if (L == NULL)
{
return ERROR;
}
L->next = L;
head = L;

for (int i = 0; i < n; ++i)
{
p = (LinkList)malloc(sizeof(LNode));///生成新结点
if (p == NULL)
{
return ERROR;
}

p->num = i+1;
p->next = L;

head->next = p;///尾插法插入新结点
head = p;
}

return OK;
}

Status PrintLink(LinkList L)///打印链表
{

LinkList p = L->next;
LinkList q;
while (p != L)
{
q = p->next;