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语言