xt;
}LinkList;
LinkList *creat(int n)
{
LinkList *p,*q,*head;
int i=1;
p=(LinkList *)malloc(sizeof(LinkList));
p->num=i;
head=p;
for(i=2;i<=n;i++)
{
q=(LinkList *)malloc(sizeof(LinkList)); /*Malloc()向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。*/
q->num=i;
p->next=q;
p=q;
}
p->next=head; /*使链表尾指向链表头 形成循环链表*/
return head;
}
void fun(LinkList *L,int m)
{
int i;
LinkList *p,*s,*q;
p=L;
printf(“出列顺序为:”);
while(p->next!=p)
{
for(i=1;i
{ q=p;
p=p->next;
}
printf(“%5d”,p->num);
s=p;
q->next=p->next;
p=p->next; /*使p指向新的起点*/
free(s);/*free()与malloc()函数配对使用,释放malloc函数申请的动态内存*/
}
printf(“%5d\n”,p->num);
}
int main()
{
LinkList *L;
int n, m;
n=9;
m=5;
L=creat(n);
fun(L,m);
return 0;
}
手机号码合法性判断(20分)
问题描述:我国大陆运营商的手机号码标准格式为:国家码+手机号码,例如:8613912345678。特点如下:
1、 长度13位;
2、 以86的国家码打头;
3、 手机号码的每一位都是数字。
请实现手机号码合法性判断的函数要求:
1) 如果手机号码合法,返回0;
2) 如果手机号码长度不合法,返回1
3) 如果手机号码中包含非数字的字符,返回2;
4) 如果手机号码不是以86打头的,返回3;
【注】除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说,如果判断出长度不合法,直接返回1即可,不需要再做其他合法性判断。
要求实现函数:int s int verifyMsisdn(char* inMsisdn)
【输入】 char* inMsisdn,表示输入的手机号码字符串。
【输出】 无
【返回】 判断的结果,类型为int。
示例
输入: inMsisdn = “869123456789“
输出: 无
返回: 1
输入: inMsisdn = “88139123456789“
输出: 无
返回: 3
输入: inMsisdn = “86139123456789“
输出: 无
返回: 0
答案:
#include
#include
#include
#include
#define LENGTH 13
int verifyMsisdn(char *inMsisdn)
{
//char *pchar=NULL;
assert(inMsisdn!=NULL);
if(LENGTH==strlen(inMsisdn))
{
if((’8′==*inMsisdn)&&(*(inMsisdn+1)==’6′))
{
while(*inMsisdn!=’\0′)
{
if((*inMsisdn>=’0′)&&(*inMsisdn<='9'))
inMsisdn++;
else
return 2 ;
}
}
else return 3;
}
else return 1;
return 0;
}
int main()
{
char *pchar=NULL;
unsigned char ichar=3;
int result;
switch(ichar)
{
case 0:
pchar="8612345363789";break;
case 1:
pchar="861111111111111";break;
case 2:
pchar="86s1234536366"; break;
case 3:
pchar="1392222222222";break;
default:
break;
}
result =verifyMsisdn(pchar);
printf("result is %d\n",result);
return 0;
}
约瑟夫问题问题描述:输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知),和初始计数值m。从数列首位置开始计数,计数到m后,将数列该位置数值替换计数值m,并将数列该位置数值出列,然后从下一位置从新开始计数,直到数列所有数值出列为止。如果计数到达数列尾段,则返回数列首位置继续计数。请编程实现上述计数过程,同时输出数值出列的顺序
比如: 输入的随机数列为:3,1,2,4,初始计数值m=7,从数列首位置开始计数(数值3所在位置)
第一轮计数出列数字为2,计数值更新m=2,出列后数列为3,1,4,从数值4所在位置从新开始计数
第二轮计数出列数字为3,计数值更新m=3,出列后数列为1,4,从数值1所在位置开始计数
第三轮计数出列数字为1,计数值更新m=1,出列后数列为4,从数值4所在位置开始计数
最后一轮计数出列数字为4,计数过程完成。输出数值出列顺序为:2,3,1,4。要求实现函数:
void array_iterate(int len, int input_array[], int m, int output_array[])
【输入】 int len:输入数列的长度;int intput_array[]:输入的初始数列;int m:初始计数值
【输出】 int output_array[]:输出的数值出列顺序
【返回】 无
示例
输入:int input_array[] = {3,1,2,4},int len = 4, m=7
输出:output_array[] = {2,3,1,4}
答案:
#include
#include
#include
typedef struct Node
{
int num;
struct Node *next;
}LinkList;
LinkList *creat(int len , int input_array[])
{
LinkList *h,*s,*p;
int i;
h=(LinkList*)malloc(sizeof(LinkList));
h->num=input_array[0];
p=h;
for(i=1;i
{
s=(LinkList*)malloc(sizeof(LinkList));
s->num=input_array[i];
p->next=s;
p=s;
}
p->next=h;
return (h);
}
void array_iterate(int len, int input_array[], int m)
{
LinkList *q,*p,*s;
int i=0,j=0,k;
int output_array[4];
p=creat(len,input_array);
while(p->next!=p)
{
for(i=1;i
{
q=p;
p=p->next;
}
m=p->num;
printf(“%5d” |