二级C语言操作例题(三十六)

此博客包含三个编程题目,分别涉及链表的逆置、字符串查找计数以及字符串合并。第一题中,fun函数实现了单向链表的逆置,通过指针操作重新排列链表节点。第二题中,fun函数计算一个字符串在另一个字符串中出现的次数,通过双指针法实现。第三题,fun函数将多个字符串合并成一个新的字符串,按顺序连接数组中的每个字符串。
摘要由CSDN通过智能技术生成

一、程序填空题

在此程序中,函数fun的功能是将带头结点的单向链表逆置,即若原链表中从头至尾结点数据域依次为2,4,6,8,10,逆置后,从头至尾结点数据域依次为10,8,6,4,2。

#include  <stdio.h>

#include  <stdlib.h>

#define    N    5

typedef struct node {

  int  data;

  struct node  *next;

} NODE;

void fun(NODE  *h)

{ NODE  *p, *q, *r;

/**********found**********/

  p = h->__1__;

/**********found**********/

  if (p==__2__)  return;

  q = p->next;

  p->next = NULL;

  while (q)

  {  r = q->next;    q->next = p;

/**********found**********/

     p = q;          

 q = __3__;

  }

  h->next = p;

}

NODE *creatlist(int  a[])

{  NODE  *h,*p,*q;        int  i;

  h = (NODE *)malloc(sizeof(NODE));

  h->next = NULL;

  for(i=0; i<N; i++)

  {  q=(NODE *)malloc(sizeof(NODE));

     q->data=a[i];

     q->next = NULL;

     if (h->next == NULL)  h->next = p = q;

     else    {  p->next = q;  p = q;   }

  }

   return  h;

}

void outlist(NODE  *h)

{ NODE  *p;

  p = h->next;

  if (p==NULL)  printf("The list is NULL!\n");

  else

  {  printf("\nHead  ");

     do

     {  printf("->%d", p->data); p=p->next;  }

     while(p!=NULL);

     printf("->End\n");

  }

}

void main()

{  NODE  *head;

   int  a[N]={2,4,6,8,10};

   head=creatlist(a);

   printf("\nThe original list:\n");

   outlist(head);

   fun(head);

   printf("\nThe list after inverting :\n");

   outlist(head);

}

答案:(1) next (2) NULL (3) r

二、程序修改题

在此程序中,函数fun的功能是:计算s所指字符串中含有t所指字符串的数目,并作为函数值返回。

#include  <stdlib.h>

#include  <conio.h>

#include  <string.h>

#include  <stdio.h>

#define N 80

int fun(char *s,char *t)

{ int n;

  char *p, *r;

  n=0;

  /*************found**************/

  *r=t;

  while ( *s )

  {

  p = s;

      while ( *r )

  {

        if ( *r == *p )

        {

r++;

p++;

}

        else

break;

        if ( *r == '\0' )

n++;

  }

  /*************found**************/

  ____1___;

      s++;

  }

  return  n;

}

void main()

{char a[N],b[N]; int m;

 printf("\nPlease enter string a: ");

gets(a);

 printf("\nPlease enter substring b: ");

gets(b);

 m=fun(a,b);

 printf("\nThe result is :m=%d\n",m);

}

答案:(1) r=t; (2) r=t;

三、程序设计题

编写函数fun,该函数的功能是:将放在字符串数组中的M个字符串(每串的长度不超过N),按顺序合并组成一个新的字符串。

例如,若字符串数组中的M个字符串为{“AAAA”,”BBBBBBB”,”CC”}则合并后字符串内容应该是”AAAABBBBBBBCC”。

#include <stdio.h>

#include <conio.h>

#define M 3

#define N 20

void fun(char a[M][N],char *b)

{

  

}

void main()

{

  FILE *wf;

  char w[M][N]={"AAAA", "BBBBBBB", "CC"},i;

  char a[100]={ " ##############################"};

  printf("The string:\n ");

  for(i=0;i<M;i++)

     puts(w[i]);

  printf("\n ");

  fun(w,a);

  printf("The A string:\n ");

  printf("%s ",a);

  printf("\n\n ");

/******************************/

  wf=fopen("out.dat","w");

  fprintf(wf,"%s",a);

  fclose(wf);

/*****************************/

}

答案:

int i,j,k=0;

for(i=0;i<M;i++)        /*将字符串数组中的M个字符串,按顺序存入一个新的字符串*/

for(j=0;a[i][j]!='\0';j++)

b[k++]=a[i][j];

b[k]='\0';             /*在字符串最后加上结束标志符*/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值