题目:3.2 设计一个算法,求一个单链表中的结点个数。
来源李云清版《数据结构》
代码解析
代码
代码如下:
#include <stdlib.h>
#include <stdio.h>
typedef struct node
{ int data;
struct node *next;
}linknode;
/*定义结点的类型*/
typedef linknode *linklist;
/*定义指针的别名,后面可以用linklist创立指针*/
/*尾插法创建带头结点的单链表*/
/*尾插法就是在结点后不断插入新的结点*/
/*代码用了双指针法*/
linklist creatlinklist()
{ linklist head,r,s;
int x;
head=r=(linklist)malloc(sizeof(linknode));
printf("\n请输入一组以0结束的整数序列:\n");
scanf("%d",&x);
while (x)
{ s=(linklist)malloc(sizeof(linknode));
s->data=x;
r->next=s;
r=s;
scanf("%d",&x);
}
r->next=NULL;
return head;
}
/*输出带头结点的单链表*/
void print(linklist head)
{ linklist p;
p=head->next;
printf("单链表如下:\n");
while(p)
{ printf("%5d",p->data);
p=p->next;
}
printf("\n");
}
/*计算单链表的结点个数*/
int count(linklist head)
{ int c=0;
linklist p=head;
while (p)
{ c++;
p=p->next;
}
return c;
}
/*计算单链表中带头结点的结点个数*/
int countofhead(linklist head)
{ int c=0;
linklist p=head->next;
while (p)
{ c++;
p=p->next;
}
return c;
}
int main() /*测试函数*/
{ linklist head;
head=creatlinklist();
print(head);
printf("\n单链表中结点的个数是:%d",count(head));
printf("\n单链表中带头结点的结点个数是:%d\n",countofhead(head));
}
实现代码结果
代码模块
代码模块部分如下:
第一部分是写结点类型并定义指针的别名
typedef struct node
{ int data;
struct node *next;
}linknode;
typedef linknode *linklist;
也可以把*linklist放到linknode后
第二部分是用尾插法创捷带头结点的单链表
linklist creatlinklist()
{ linklist head,r,s;
int x;
head=r=(linklist)malloc(sizeof(linknode));
printf("\n请输入一组以0结束的整数序列:\n");
scanf("%d",&x);
while (x)
{ s=(linklist)malloc(sizeof(linknode));
s->data=x;
r->next=s;
r=s;
scanf("%d",&x);
}
r->next=NULL;
return head;
}
过程图示如下:
第三部分是输出带头结点的单链表
void print(linklist head)
{ linklist p;
p=head->next;
printf("单链表如下:\n");
while(p)
{ printf("%5d",p->data);
p=p->next;
}
printf("\n");
}
第四部分是两个模块,第一个模块是计算单链表的结点个数,第二个模块是计算带头结点的单链表的个数
/*计算单链表的结点个数*/
int count(linklist head)
{ int c=0;
linklist p=head;
while (p)
{ c++;
p=p->next;
}
return c;
}
/*计算单链表中带头结点的结点个数*/
int countofhead(linklist head)
{ int c=0;
linklist p=head->next;
while (p)
{ c++;
p=p->next;
}
return c;
}
需要注意的是,单链表的结点个数是10,而带头结点的单链表个数是9,这是因为计算单链表的结点个数是从头结点开始计算的,而计算带头结点的单链表是从第一个结点开始计算的
第五部分就是测试这个函数了
int main()
{ linklist head;
head=creatlinklist();
print(head);
printf("\n单链表中结点的个数是:%d",count(head));
printf("\n单链表中带头结点的结点个数是:%d\n",countofhead(head));
return 0;
}
本题涉及到了怎么创建单链表,对单链表的结点进行计算这两个问题
如对读者有帮助,作者不胜感激