面试试题(编程)

   好久以前面试了一家公司,给出了一道面试试题.结果在网上也看到这个题目,所以动起了想把自己的实现方法写出来的冲动.

题目是这样:用户输入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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值