|

楼主 |
发表于 2016-4-4 18:21:37
|
显示全部楼层
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h> //exit(-1)结束程序
//函数声明
struct NODE1
{
int data;
struct NODE1 * pNext;
};
typedef struct NODE1 NODE;
//typedef struct NODE1 * PNODE; 其实可以恢复
NODE * creat_list(); //函数声明
int length_list (NODE * pHead);
void delete_list(NODE * pHead, NODE * p);
int main()
{
NODE * pHead = creat_list();
int count = 0;
int flag = 0, sign = 0; //flag表示是否到了最后一个节点 sign表示是否是删除元素
NODE * p = pHead;
NODE * q = NULL;
while (length_list(pHead)>1)
{
if (sign == 0) //之前p没被删除
{p = p->pNext;}
else if (sign == 1) //之前p被删除,已经在前面步骤指定好p取值了
{sign = 0; //恢复
}
++ count;
if(p->pNext == NULL) //如果p是最后一个节点
{
flag = 1;
}
if (count == 3 && p != NULL) //报数报到3
{
q = p->pNext; //存放地址
delete_list (pHead, p); //p被删掉了就没有了啊啊啊啊!
count = 0;
p = q;
sign = 1; //标识:p被删除了,然后现在存放了原来p位置下一个节点的地址
}
if (flag == 1) //最后一个返回
{
p = pHead;
flag = 0;
}
}
printf ("剩余的人的编号是:%d\n", pHead->pNext->data);
while (1);
return 0 ;
}
NODE * creat_list()
{
NODE * pHead = (NODE * )malloc(sizeof(NODE));
int len, data, i;
NODE * pTail;
printf("一共多少人玩(请输入人数):\n");
scanf_s ("%d", &len); //程序提示啊scanf_s
if (pHead == NULL)
{
printf ("分配内存失败,程序结束!");
exit(-1);
}
pHead->pNext = NULL;
pTail = pHead;
for (i=0; i<len; i++)
{
NODE * pNew = (NODE * )malloc(sizeof(NODE));
if (pNew == NULL)
{
printf ("分配内存失败,程序结束!");
exit(-1);
}
pNew->pNext = NULL;
pNew->data = i+1;
pTail->pNext = pNew;
pTail = pNew;
}
return pHead;
}
int length_list (NODE * pHead)
{
int len = 0;
NODE * p = pHead->pNext;
while (p != NULL)
{
len++;
p = p->pNext;
}
return len;
}
void delete_list(NODE * pHead, NODE * p)
{
//if (pHead->pNext == NULL)
// return false;
NODE * pTag = pHead->pNext; NODE * pFore = pHead;
while (pTag != p)
{
pFore = pTag;
pTag = pTag->pNext;
}
if (p->pNext != NULL)
{
pFore->pNext = p->pNext; //pFore!
}
else pFore ->pNext = NULL;
printf("出局吧少年%d号\n",p->data);
free (p);
p = NULL;
//return true;
}
我自己调试出来了(哭笑不得) |
|