设head指向一个非空单向链表
1、输出链表数据域的所有值
void Printlink1(ElemSN *h) //递归实现正向输出
{
if(h) //判断h不为空
{
printf("%5d",h->data);
Printlink1(h->next); //先输出再调用,输出一位调用一下
}
}
2、逆向输出所有值
void Printlink2(ElemSN *h) //递归实现逆向输出
{
if(h)
{
Printlink2(h->next);
printf("%5d",h->data);//先调用,使h跑到最后一位,再输出
}
}
3、返回链表所有结点的和
int Sumlink(ElemSN *h) //求链表结点的和
{
if(h)
return Sumlink(h->next)+h->data;//h一直向后指,和就等于h的值加上后面剩余链表的值,以此类推
else
return 0;
}
4、返回链表数据域值为奇数的个数
5、返回链表数据域值为k的结点的个数
ElemSN *FindNode(ElemSN *h,int k)//返回链表数据域值为k的节点的地址
{
if(h&&h->data-k)
return FindNode(h->next,k);//h不为0并不等于k时一直向后跑,直到等于NULL或k时停下,返回这时的h
else
return h;
}
以下为完整程序:
#include <stdio.h>
#include <stdlib.h>
#define N 5
//结构体定义
typedef struct node{
int data;
struct node *next;
}ElemSN;
//正向创建单向链表
ElemSN *Creatlink(int a[])
{
ElemSN *h,*t=NULL,*p;
for(int i=0;i<N;i++)
{
p=(ElemSN *)malloc(sizeof(ElemSN));
p->data=a[i];
p->next=NULL;
if(!t) //如果t为空,说明为头结点
h=t=p;
else
t=t->next=p; //实现建链
}
return h;
}
//递归实现正向输出
void Printlink1(ElemSN *h)
{
if(h) //判断h不为空
{
printf("%5d",h->data);
Printlink1(h->next); //先输出再调用,输出一位调用一下
}
}
//递归实现逆向输出
void Printlink2(ElemSN *h)
{
if(h)
{
Printlink2(h->next);
printf("%5d",h->data);//先调用,使h跑到最后一位,再输出
}
}
//求链表结点的和
int Sumlink(ElemSN *h)
{
if(h)
return Sumlink(h->next)+h->data;
else
return 0;
}
//求链表的奇数结点的个数
int CountOddNode(ElemSN *h)
{
if(h) //令h向链表尾部跑,再判断h结点的奇偶性
return CountOddNode(h->next)+h->data%2;
else
return 0;
}
//返回链表数据域值为k的节点的地址
ElemSN *FindNode(ElemSN *h,int k)
{
if(h&&h->data-k)
return FindNode(h->next,k);//h不为0并不等于k时一直向后跑,直到等于NULL或k时停下,返回这时的h
else
return h;
}
//主函数
int main(void)
{
int a[5]={1,2,3,4,5};
int sum,cnt,key=6;
ElemSN *h=NULL,*q;
h=Creatlink(a);//创建链表
Printlink1(h);//正向输出
printf("\n");
Printlink2(h);//逆向输出
sum=Sumlink(h);//求链表结点的和
printf("\nSUM=%3d\n",sum);
cnt=CountOddNode(h);//求链表的奇数结点的个数
printf("Count=%d\n",cnt);
q=FindNode(h,key);//返回链表数据域值为k的节点的地址
printf("K的地址为:%d\n",q->data);
return 0;
}