求带头结点的单链表中的结点个数
#include <stdio.h>
#include <stdlib.h>
typedef struct links{
int elem;
struct links *next;
}link;
link* chuangzaolinks(){
link *p=(link*)malloc(sizeof(link));
link *temp=p;
int x;
for(int i=1;i<5;i++){
link*a=(link*)malloc(sizeof(link));
printf("please input your element:");
scanf("%d",&x);
a->elem=x;
a->next=NULL;
temp->next=a;
temp=temp->next;
}
return p;
}
void displaylink(link *p){
link *temp=p;
while(temp->next){
temp=temp->next;
printf("%d\n",temp->elem);
}
}
int showlink(link*p){
link *temp=p;
int d=0;
while(temp->next){
temp=temp->next;
d++;
}
return d;
}
int main(){
link *p;
p=chuangzaolinks();
displaylink(p);
printf("结点个数为%d",showlink(p));
return 0;
}
求不带头结点的单链表的结点个数:
#include <stdio.h>
#include <stdlib.h>
typedef struct links{
int elem;
struct links *next;
}link;
link* chuangzaolinks(){
link *p=NULL;
link *temp;
int x;
temp=(link*)malloc(sizeof(link));
temp->elem=1;
temp->next=NULL;
p=temp;
for(int i=2;i<5;i++){
link*a=(link*)malloc(sizeof(link));
printf("please input your element:");
scanf("%d",&x);
a->elem=x;
a->next=NULL;
temp->next=a;
temp=temp->next;
}
return p;
}
void displaylink(link *p){
link *temp=p;
while(temp){
printf("%d\n",temp->elem);
temp=temp->next;
}
}
int showlink(link*p){
link *temp=p;
int d=0;
while(temp){
temp=temp->next;
d++;
}
return d;
}
int main(){
link *p;
p=chuangzaolinks();
displaylink(p);
printf("结点个数为%d",showlink(p));
return 0;
}
就本例而言,带头结点与不带头结点的差距体现在一下几点:
1.创造
2.输出
创造:
带头结点: link *p=(link*)malloc(sizeof(link));//直接创造头结点
link *temp=p;//创造指向头结点的指针
不带 link *p=NULL;//创造头指针而不是头结点
link * temp=(link*)malloc(sizeof(link));//创造首元结点,并给与空间
temp->elem=1;//初始化
temp->next=NULL;
p=temp;
输出:
带
link *temp=p;
while(temp->next){
temp=temp->next;//(当初想了挺长时间)由于头结点的缘故,第一个temp指向的是没有东西的头结点,所以需要顺延一位
printf("%d\n",temp->elem);}
不带
link *temp=p;
while(temp){
printf("%d\n",temp->elem);//直接指向首元结点,所以不需要
temp=temp->next;}
过程中遗忘的c语言基础知识:
1.C语言 函数 return 语句可以有多个,可以出现在函数体的任意位置,但是每次调用函数只能有一个 return 语句被执行,所以只有一个返回值(少数的编程语言支持多个返回值,例如Go语言)
本文只具有一定参考作用,不具有指导作用,如有错误,还请各位大佬斧正。