得链表者得天下(上)

    直接开始干。

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


谢谢大家,我是小纸人,希望大家多多关注我的博客哦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值