/*This is a test*/
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int d;
struct node* next;
} node, * ptr;
//这里是定义结构与结构便捷生成的连用,*ptr等效为typedef ... *ptr,以后用ptr xx就相当于struct node *xx
ptr createList(int n);
void delList(ptr List);
void printList(ptr List);
ptr baoshu(int n, int k, int m);
int main()
{
int n, k, m;
ptr data;
printf("请输入人数n,间隔人数k,剩余人数m:\n");
scanf("%d%d%d", &n, &k, &m);
data = baoshu(n, k, m);
printList(data);
return 0;
}
ptr createList(int n)
{
ptr Header = (ptr)malloc(sizeof(node));
ptr p, q;
if (!Header)return NULL;
Header->next = Header;
p = Header;
for (int i = 1; i <= n; ++i)
{
q = (ptr)malloc(sizeof(node));
if (!q)
{
delList(Header);//释放已分配的空间
return NULL;
}
q->d = i;
q->next = p->next;
p->next = q;
p = q;
}
return Header;
}
ptr baoshu(int n, int k, int m)
{
ptr Header = createList(n);
ptr p = Header->next, q;
int i = 1, j = n;//i控制每k人删除掉这个节点,j代表剩余人数
while (j > m)
{
if (i == k - 1)
{
if (p->next != Header)//不是头节点就跳过
{
q = p->next;
p->next = q->next;
}
else//删除头节点,不然后面输出的时候一开始会多打印一个头结点的空内容
{
q = Header->next;
Header->next = q->next;
}
free(q);
if (p->next != Header)
{
p = p->next;
}
else
{
p = Header->next;
}
--j;
i = 1;
}
else
{
if (p->next == Header)
{
p = Header->next;
}
else
{
p = p->next;
}
++i;
}
}
return Header;
}
void printList(ptr List)
{
ptr p = List->next;
while (p != List)
{
printf("%5d", p->d);
p = p->next;
}
}
void delList(ptr List)
{
ptr p = List, q;
while (p->next != List)
{
q = p->next;
p = q->next;
free(q);
}
free(List);
}
C-单链表删除指定位置数据
最新推荐文章于 2024-08-18 21:24:06 发布