本文主要是介绍杭电ACM-1216-Assistance Required,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
今天花了大半个下午来做这个题。说难吧,还行;不难吧,也花了这么长时间。总之一句话,会的不难,难的不会;我想理工科的童鞋都知道这个道理。至于题目,大家请前往这儿(http://acm.hdu.edu.cn/showproblem.php?pid=1216)。整个题目用链表是最好理解的,当然其他方法也行。
下面就是代码,若哪儿有不对,请各位不吝指出!
#include<stdio.h>
#include<malloc.h>
typedef int IntType;
typedef struct node
{IntType date;struct node *next;
} LNode, *LinkList;
LinkList Creat()//创建并插入节点
{LinkList s, r, H;int i ;H = (LinkList)malloc(sizeof(LNode));H->next = NULL;r = H;for(i = 2; i <= 35000; i++){s = (LinkList)malloc(sizeof(LNode));s->date = i;s->next = r->next;r->next = s;r = s;}return H;
}
void Read(LinkList H, int n)//读取指定的lucky number
{LinkList r;int i;r = H->next;for(i = 1; i < n; i++){if(r->next != NULL)r = r->next;else break;}printf("%d\n", r->date);
}
int Del(LinkList H, int beg)
{LinkList s, r, t;int i = 1;int j , k = 1;int NextBeg;//下一个开始的数值(即决定隔多少个数删除下一个节点)r = H;for(; ;){r = r->next;if(r->date == beg)//找到本次开始的数值break;}s = r->next;//本次节点的下一个节点if(s == NULL)//如果本次节点是最后一个节点,则直接返回0return 0;NextBeg = s->date;//下一次调用这个函数时的开始数值for(;;){for(j = 1; j < beg; j++){s = s->next;//s指向要删除的节点r = r->next;//r指向s的上一个节点if(s == NULL || s->next == NULL)//如果移动到最后位置,则代表以本次删除结束return NextBeg;}//往下移动beg-1个r->next = s->next;t = s;s = r->next;free(t);//释放掉删除的节点}return NextBeg;
}int main()
{LinkList H;int beg = 2;int pos;H = Creat();for(;;){if(beg == 0)break;beg = Del(H, beg);//循环以beg的长度删除节点}for(;;){scanf("%d", &pos);if(pos == 0)break;Read(H, pos);}return 0;
}
这篇关于杭电ACM-1216-Assistance Required的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!