统计带头结点的单向链表的个数并存放在形参n所指的单元中。 欢迎评论 指点。

时间:2022-10-31 19:46:32
 
#include    <stdio.h>
#include <stdlib.h>
#define N 8
typedef struct list //定义结构体
{ int data;
struct list *next;
} SLIST; //新类型SLIST
SLIST *creatlist(int *a); //函数说明 返回值为 STIST形的指针
void outlist(SLIST *); //函数说明

void fun( SLIST *h, int *n) //定义函数 参数 指向该类型的指针h、指向整形的指针n
{ SLIST *p; // 定义指向该类型指针变量 p
*n =0;
p=h->next; // p指向首元元素
while(p) //当 p 不为空时
{ (*n)++; //*n 自加
p=p->next; // p后移
}
}

main() //主函数
{ SLIST *head; //定义该指向类型的指针 head
int a[N]={12,87,45,32,91,16,20,48}, num; //定义整形数组a、整形数num
head=creatlist(a); outlist(head); //将链表的首地址给head
fun(head, &num);
printf("\nnumber=%d\n",num);
}

SLIST *creatlist(int a[])//定义函数 建立链表 返回值为SLIST类型的地址 参数为整形数组
{ SLIST *h,*p,*q; int i; //定义 该类型的指针 h p q ,整形i
h=p=(SLIST *)malloc(sizeof(SLIST)); //动态分配 SLIST 形空间头结点 首地址给 h、p
for(i=0; i<N; i++)
{ q=(SLIST *)malloc(sizeof(SLIST)); //动态分配N个SLIST型空间
q->data=a[i]; p->next=q; p=q; //给每一个date为数组元素
}
p->next=0;
return h;
}

void outlist(SLIST *h) //定义函数 形参 指向该类型的指针
{ SLIST *p; 定义指向该类型的指针变量 p
p=h->next; //p指向 首元元素
if (p==NULL) printf("The list is NULL!\n");//判断链表是否为空 是 打印the list is null!
Else //不为空
{ printf("\nHead "); // 换行 打印 head
do
{ printf("->%d",p->data); p=p->next; } // 打印 -> date 、p后移。
while(p!=NULL); //直到 p指向尾元素的指针域
printf("->End\n"); //打印 ->end 换行
}
}