直接开始干。
设head指向单向非空链表,数据域值为正整数。
①输出数据域的值。
②逆向输出数据域的值。
③返回所有结点的和。
④返回最小值。
⑤返回奇数结点的个数。
⑥返回数据域值为KEY的结点的地址。没找到返回NULL。
解:
1。
非递归,
for(p=h;p;p=p->next);
printf("%3d",p->data);
递归(永远只处理H指向的结点)
先处理,在调用。
void Printlink(ElemSN* h)
{ if(h)//链表不为空,就输出那个节点
{ printf("%3d",p->data);
Printlink(h->next);//输出完之后,返回接着输出下一个。
}
}
先调用,后处理大家也应该会写了。
2。
非递归:
放置一个岗哨end,就可以逆着输出了。
end==NULL;//放置end
while(end-h)
{for(p=h;p->next-end;p=p->next)//因为是逆着输出所以,p->next要不为空;
printf("%3d",p->data);
end=p;//end前移
}
递归:
void * preprintlink(ElemSN * h)
{ ElemSN* p;
if(h)//
{
preprintlink(h->next);//往后跑,
printf("%3d",h->data);//跑到最后,开始依次输出,返回,输出,返回。。。。
}
}
3.
返回结点的和。
非递归:
弄一个累加器,遍历一遍链表,给累加器加上值就可以了。这里就不写了。
递归:
int sumlink(ElemSN *h)
{
if(h)
return sumlink(h->next)+h->data;//一直调,调到最后一个,慢慢往回加。
else
return 0;
}
4.
非递归:
和第三个一样,定义一个最小值min,跑一遍,比较一下,把最小的给min就行了。
递归:
int findminnode(ElemSN *h)
{
int min;
if(h->next)//不是只有一个结点
{
min=findminnode(h->next);//调
if(h->data<min)
min=h->data;//比大小,小的给min
}
else
min=h->data;//只有一个节点,最小就是本身
return min;
}
5.
返回奇数结点个数:
非递归,跑一遍,判断下,是奇数累加器cnt++,不是继续跑,直到跑完。
递归:
int countoddnode(ElemSN*h)
{
if(h==NULL)//空链表,没有奇数节点
return 0;
else
return countoddnode(h->next)+h->data%2;//先调,再加上1(当前节点奇数)或者加上0(当前结点是偶数)
}int countoddnode(ElemSN*h)
{
if(h==NULL)//空链表,没有奇数节点
return 0;
else
return countoddnode(h->next)+h->data%2;//先调,再加上1(当前节点奇数)或者加上0(当前结点是偶数)
}
6.
非递归:
for(p=h;p&&p->data-key;p=p->next);
if(!p)
return NULL;//跑到最后了,没找到
else
return p;//停在KEY上了,返回地址
递归:
ElemSN * findkeynode(ElemSN* h,int key)
{
if(h&&h->data-key)//有节点且结点的值不是KEY,就调
//没有结点之间就返回H;
h=findkeynode(h->next,key);//调完给H;
return h;
}
到这里为大家附上完整的代码:
#include<stdio.h>
#include<stdlib.h>
#define N 5
typedef struct node{
int data;
struct node *next;
}ElemSN;
ElemSN *createlink1(int a[])
{
ElemSN *h=NULL,*tail,*p;
for(int i=0;i<N;i++)
{
p=(ElemSN*)malloc(sizeof(ElemSN));//分配一个动态单元给p
p->data=a[i];//数据域赋值
p->next=NULL;//指针域赋空
if(!h)
h=tail=p;//判断是不是第一个结点,是,头尾都指上来
else
tail=tail->next=p; //不是,挂链,挪尾指针。
}
return h;//返回头指针h
}
void*printlink(ElemSN*h)
{
ElemSN*p;
for(p=h;p;p=p->next)
printf("%5d",p->data);
printf("\n");
}
int sumlink(ElemSN *h)
{
if(h)
return sumlink(h->next)+h->data;
else
return 0;
}
void preprintlink(ElemSN * h)//倒序输出递归
{ ElemSN* p;
if(h)
{
preprintlink(h->next);
printf("%5d",h->data);
}
}
int findminnode(ElemSN *h)
{
int min;
if(h->next)//不是只有一个结点
{
min=findminnode(h->next);//调
if(h->data<min)
min=h->data;//比大小,小的给min
}
else
min=h->data;//只有一个节点,最小就是本身
return min;
}
int countoddnode(ElemSN*h)
{
if(h==NULL)//空链表,没有奇数节点
return 0;
else
return countoddnode(h->next)+h->data%2;//先调,再加上1(当前节点奇数)或者加上0(当前结点是偶数)
}
ElemSN * findkeynode(ElemSN* h,int key)
{
if(h&&h->data-key)//有节点且结点的值不是KEY,就调
//没有结点之间就返回H;
h=findkeynode(h->next,key);//调完给H;
return h;
}
int main (void)
{
int a[N]={1,2,3,4,5};
int sum,min,oddnode,key=4;
ElemSN *head=NULL,*p;
//正向创建链表
head=createlink1(a);//用head接收头指针
//输出链表
printlink(head);
preprintlink(head);//逆向输出
sum=sumlink(head);//求和
printf("\nSUM=%d\n",sum);
min=findminnode(head);//找最小值
printf("MIN=%d\n",min);
oddnode=countoddnode(head);
printf("奇数结点个数=%d\n",oddnode);
p=findkeynode(head,key);
printf("KEY值是:%d\n",p->data);
return 0;
}
谢谢大家,我是小纸人,希望大家多多关注我的博客哦。