当前位置:编程学习 > C/C++ >>

C 语言的问题

#include    <stdio.h>
#include    <stdlib.h>
#define    N    8
typedef  struct list
{  int  data;
   struct list  *next;
} SLIST;
SLIST *creatlist(char  *);
void outlist(SLIST  *);
int fun( SLIST  *h, char  ch)
{  SLIST  *p;        int  n=0;
   p=h->next;
/**********found**********/
   while(p!=NULL)
   {   n++;
/**********found**********/
       if (p->data==ch)  return n;
       else  p=p->next;
   }
   return 0;
}
main()
{  SLIST  *head;       int  k;      char  ch;
   char  a[N]={'m','p','g','a','w','x','r','d'};
   head=creatlist(a);
   outlist(head);
   printf("Enter a letter:");
   scanf("%c",&ch);
/**********found**********/
   k=fun(head,ch);
   if (k==0)   printf("\nNot found!\n");
   else       printf("The sequence number is :  %d\n",k);
}
SLIST *creatlist(char  *a)
{  SLIST  *h,*p,*q;      int  i;
   h=p=(SLIST *)malloc(sizeof(SLIST));
   for(i=0; i<N; i++)
   {  q=(SLIST *)malloc(sizeof(SLIST));
      q->data=a[i];  p->next=q;  p=q;
   }
   p->next=0;
   return  h;
}
void outlist(SLIST  *h)
{  SLIST  *p;
   p=h->next;
   if (p==NULL)  printf("\nThe list is NULL!\n");
  else
  {  printf("\nHead");
     do
     { printf("->%c",p->data);  p=p->next;  }
     while(p!=NULL);
     printf("->End\n");
  }
}

 

 

帮我分析下这个程序,每一步的过程,看的有点晕,仿汇编我看不懂撒.......

补充:上机抽到这种题目就麻烦了......
答案:仿汇编?理由是什么?
花了一点时间加上了一些注释,你这代码的风格我改了一下,具体代码如下:

#include    <stdio.h>
#include    <stdlib.h>
#define    N    8


//定义一个list结构体,并用typedef为这个结构体类型创建一个同义字
typedef  struct list

   int  data;
   struct list  *next;
}SLIST;


//使用SLIST就相当于使用struct list
SLIST *creatlist(char  *);


void outlist(SLIST  *);//预先声明一下这个函数的原型


int fun( SLIST  *h, char  ch)
{
  SLIST  *p;  //声明一个结构体指针p
  int  n=0;  //定义一个整型变量n
  p=h->next; //指针p指向传入的结构体中的成员变量next,这个结构体指针next 也可以指向下一个结构体,我把它当成一个结点
/**********found**********/
   while(p!=NULL)//循环条件是p不为NULL,也就是下一个结点有效
   {   n++;
/**********found**********/
       if (p->data==ch)  //如果结构体的成员变量data和ch一样
          return n; //返回n的值
       else  
       p=p->next;//否则,p指向下一个结构体,这个指向下一个结构体的指针是当前指针p指向的结构体中的指针next,只需要将指针next赋值给指针p即可
   }
   return 0;
}
main()
{  
   SLIST  *head; 
   int  k; 
   char  ch;
   char  a[N]={'m','p','g','a','w','x','r','d'};
   head=creatlist(a); //创建链表,并将字符串a中的每个字符加入链表中,之后得到链表的头部指针
   outlist(head);//将链表的头部指针传进去
   printf("Enter a letter:");
   scanf("%c",&ch);//输入一个字符
/**********found**********/
   k=fun(head,ch);//在链表中查找这个字符,并用变量k保存返回值
   if (k==0) //如果返回值为0,表明没有找到
     printf("\nNot found!\n");
   else //否则,找到了
     printf("The sequence number is :  %d\n",k);
}




SLIST *creatlist(char  *a)
{
   SLIST  *h,*p,*q;
   int  i;
   //分配合适的内存空间给指针p,之后将p的赋值给指针h,其实就是拷贝一次指针p,因为下面会对指针p进行修改
   h=p=(SLIST *)malloc(sizeof(SLIST));
   for(i=0; i<N; i++)
   {//循环N次
 //分配合适的内存空间给指针q,这时,分配的内存空间还是独立的,没有加入至链表中
 q=(SLIST *)malloc(sizeof(SLIST));
      q->data=a[i];//将字符串a中的第i+1个字符赋给当前结构体中的成员变量data
      p->next=q; //将之前创建的结构体中的next指针指向刚刚创建的结构体,也就是将刚刚创建的结构体加入至链表中
      p=q;//指针p切换到刚刚创建的结构体,指针q会在下一次循环中指向新创建的结构体
   }
   p->next=0;//指针赋值为0,可以将0改成NULL,用于表示到链表末尾了
   return  h;//返回链表的头指针,也就是之前保存的第一个结构体的指针
}




void outlist(SLIST  *h)
{  
  SLIST  *p;
  p=h->next;//得到结构体中的next指针
  if (p==NULL)  //如果next指针无效,也就是说没有指向一个有效的结构体
    printf("\nThe list is NULL!\n");
  else
  {//否则
    printf("\nHead");
    do
    { //先执行这个循环体,再判断循环条件
      printf("->%c",p->data);//显示当前结构体中的成员变量data
      p=p->next;//切换至下一个结构体,也就是下一个结点
    }
    while(p!=NULL);//指针p有效就继续循环,无效则表示到链表末尾了
    printf("->End\n");
  }
}


上一个:c语言数组问题
下一个:如何学好c语言

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,