难得遇到自己会写的题。
思路很简单:从链表k开始,每输出一个就删除相应的节点。一直到n为零为止。
不过还是问题百出。先是把malloc函数用在了main的外面,哈哈。
接着就是=与==的疏忽。
跌跌撞撞也算完成了。
#include<stdio.h>
#include<stdlib.h>
struct node
{
int number;
struct node *next;
};
typedef struct node NODE;
int main()
{
NODE *head;
head = (NODE*)malloc(sizeof(NODE));
head->number = 1;
head->next = NULL;
int n, k, m;
scanf("%d,%d,%d", &n, &k, &m);
if (k > n)printf("k should not bigger than n.\n");
else if (k < 1 || m < 1 || n < 1)printf("n,m,k must bigger than 0.\n");
else
{
NODE *node, *prior;
prior = head;
//create the link
for (int i = 1; i < n; i++)
{
node = (NODE*)malloc(sizeof(NODE));
if (node == NULL)exit(0);// failed and exit
if (i == n - 1) node->next = head;
node->number = i + 1;
prior->next = node;
prior = node;
}
//find k;
NODE *nodek = head;
for (int i = 0; i < k - 1; i++)
nodek = nodek->next;
/*printf("nodek->number %d\n", nodek->number);
for (int i = 0; i < n+20; i++)
{
printf("number:%d\n", head->number);
head = head->next;
}
*/
//printf("TEST1\n");
NODE *deleteNode = NULL;
int count = 0;
while (n != 0)
{
count++;
//printf("k:%d\n", nodek->number);
//printf("TEST2\n");
if (n == 1)
{
printf("%d\n", nodek->number);
break;
}
for (int i = 0; i < m-1; i++) nodek = nodek->next;
//printf("TEST2.5\n");
printf("%d", nodek->number);
if (count != 0 && count % 10 == 0)
printf("\n");
else
printf(" ");
//delete the printed number.
deleteNode = nodek;
while (1)
{
//printf("TEST3\n");
if (deleteNode->next->number == nodek->number)break;
else deleteNode = deleteNode->next;
}
//printf("delete %d\n", deleteNode->next->number);
nodek = deleteNode->next;
deleteNode->next = nodek->next;
n--;
nodek = deleteNode->next;
/*for (int i = 0; i < n; i++)
{
printf("after:%d\n", deleteNode->number);
deleteNode = deleteNode->next;
}*/
}
}
}