好久以前面试了一家公司,给出了一道面试试题.结果在网上也看到这个题目,所以动起了想把自己的实现方法写出来的冲动.
题目是这样:用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至最后一个元素并输出该元素的值。写出C程序。
其实现代码如下(在READHAT9.0 LINUX下测试通过):
/********************************************
*文件名:game_ouputnum.h
*文件描述:给定M,N值,从1至N开始顺序循环数数,每数到M,把该M去掉,继续直到最后一个元数并输出该无数
使用循环链表实现.
*作 者:szxf
*版本号:1.0.0
*版 权:
*修改记录:
*********************************************/
#include <stdio.h>
#include <stdlib.h>
/* N 值 */
#define NUM 8
#define OK 1
#define ERROR -1
/* M 值 */
#define NEXT 3
typedef struct
{
int data;
struct list *next;
}list;
/******************************************************
*函数名:list *createList()
*参 数:无
*功能描述:创建一个循环链表
*返回值:成功返回链表的首指针,失败返回-1
*抛出异常:
*作 者:szxf
******************************************************/
list *createList()
{
list *head=NULL;
list *tail=NULL,*temp=NULL;
int i=0;
head=(struct list *)malloc(sizeof(list));
if( head == NULL )
{
printf("malloc space failed!/n");
return ERROR;
}
head->data=1;
head->next=head;
tail = head;
for( i=2;i<=NUM; i++)
{
temp=(struct list *)malloc(sizeof(list));
if( temp == NULL )
{
printf("malloc space failed!/n");
return ERROR;
}
temp->data=i;
temp->next=head;
tail->next = temp;
tail = temp;
}
return head;
}
/******************************************************
*函数名:void printList(list *head)
*参 数:链表的首地址
*功能描述:打印出链表中所有的数据
*返回值:无
*抛出异常:无
*作 者:szxf
******************************************************/
void printList(list *head)
{
list *pList=NULL;
pList = head;
if( head == NULL)
{
printf( "printList param invalid!/n" );
}
while(head->next!=pList)
{
printf("this data is :%d/n", head->data);
head=head->next;
}
printf("the data is :%d/n",head->data);
return;
}
/******************************************************
*函数名:int getLastElem(list *pList)
*参 数:链表的首地址
*功能描述:开始顺序循环数数,得到最后一个元素的值.
*返回值:正确返回最后一个元素的值,错误返回-1
*抛出异常:无
*作 者:无
******************************************************/
int getLastElem(list *pList)
{
list *head=NULL,*temp=NULL;
int i = 1;
if(pList == NULL)
{
printf("getLastElem param invalid/n");
return ERROR;
}
head=temp=pList;
while(head!=head->next)
{
if(i==NEXT)
{
temp=head;
head=head->next;
free(temp);
pList->next=head;
temp=NULL;
i=1;
}
else
{
pList=head;
head=head->next;
i++;
}
}
printf("get lastElem:%d/n", head->data);
return head->data;
}
int main()
{
list *pList=NULL;
pList=createList();
if(pList==NULL)
{
printf("create list error!/n");
exit(0);
}
printList(pList);
printf("the last elem:%d/n",getLastElem(pList));
}
如有不足之处请指正.
转自软件技术共享网:http://itshare.17gigs.com