C语言算法基础-求单链表中带头结点的结点个数

题目:3.2 设计一个算法,求一个单链表中的结点个数。
来源李云清版《数据结构》

代码解析

  • 代码
  • 实现代码结果
  • 代码模块

代码

代码如下:

#include 
#include  
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)); 

} 

实现代码结果

C语言算法基础-求单链表中带头结点的结点个数_第1张图片

代码模块

代码模块部分如下:
第一部分是写结点类型并定义指针的别名

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; 
}

过程图示如下:
C语言算法基础-求单链表中带头结点的结点个数_第2张图片
第三部分是输出带头结点的单链表

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;
} 

本题涉及到了怎么创建单链表,对单链表的结点进行计算这两个问题

如对读者有帮助,作者不胜感激

你可能感兴趣的:(数据结构,C,笔记,c语言,数据结构,c算法)