C语言数据结构之链表部分(2)

2.链表的一些练习

(1)输出尾结点元素

#include <stdio.h>
#include <stdlib.h>
#define N 5
typedef struct node
{
      int data;
      struct node * next;
}ElemSN;
ElemSN * Createlink1(int a[]);
void Printlink(ElemSN *h);
int main()
{
      int a[N] = {10,20,30,40,50};
      ElemSN *head = NULL; 
      head = Createlink1(a);
      Printlink(head);

      printf("\n");

      return 0;
}
ElemSN * Createlink1(int a[])
{
      ElemSN *h,*tail,*p;
      int i;
      h = tail = (ElemSN *)malloc(sizeof(ElemSN));
      h->data = a[0];
      h->next = NULL;
      for(i = 1;i < N;i++)
      {
            p = (ElemSN *)malloc(sizeof(ElemSN));
            p->data = a[i];
            p->next = NULL;
            tail->next = p;
            tail = p;
      }
      return h;
}
void Printlink(ElemSN *h)
{
      ElemSN *p;
      p = h;
      while(p)
      {
            if(p->next == NULL)
            {
                  printf("尾结点元素是: %d",p->data);
                  break;
            }
            else
            {
                  p = p->next;
            }
      }
}

(2)输出节点的个数

#include <stdio.h>
#include <stdlib.h>
#define N 5
typedef struct node
{
      int data;
      struct node * next;
}ElemSN;
ElemSN * Createlink1(int a[]);
int  Printlink(ElemSN *h);
int main()
{
      int t;
      int a[N] = {10,20,30,40,50};
      ElemSN *head = NULL; 
      head = Createlink1(a);
      t = Printlink(head);

      printf("\n");

      return 0;
}
ElemSN * Createlink1(int a[])
{
      ElemSN *h,*tail,*p;
      int i;
      h = tail = (ElemSN *)malloc(sizeof(ElemSN));
      h->data = a[0];
      h->next = NULL;
      for(i = 1;i < N;i++)
      {
            p = (ElemSN *)malloc(sizeof(ElemSN));
            p->data = a[i];
            p->next = NULL;
            tail->next = p;
            tail = p;
      }
      return h;
}
int  Printlink(ElemSN *h)
{
      ElemSN *p;
      p = h;
      int i = 0;
      while(p)
      {    
            if(p->next == NULL)
            {
                  i++;
            printf("结点个数共有 %d 个",i);
            break;
            }
            else
            {
                  i++;
                  p = p->next;
            }   
      }
      return i;
}

(3)输出节点中数据域为奇数的节点数总共有多少个

#include <stdio.h>
#include <stdlib.h>
#define N 5
typedef struct node
{
      int data;
      struct node * next;
}ElemSN;
ElemSN * Createlink1(int a[]);
int  Printlink(ElemSN *h);
int main()
{
      int t;
      int a[N] = {10,20,30,40,50};
      ElemSN *head = NULL; 
      head = Createlink1(a);
      t = Printlink(head);
      printf("奇数的有%d个",t);

      printf("\n");

      return 0;
}
ElemSN * Createlink1(int a[])
{
      ElemSN *h,*tail,*p;
      int i;
      h = tail = (ElemSN *)malloc(sizeof(ElemSN));
      h->data = a[0];
      h->next = NULL;
      for(i = 1;i < N;i++)
      {
            p = (ElemSN *)malloc(sizeof(ElemSN));
            p->data = a[i];
            p->next = NULL;
            tail->next = p;
            tail = p;
      }
      return h;
}
int  Printlink(ElemSN *h)
{
      ElemSN *p;
      int cnt = 0;
      for(p = h;p;p = p->next)
      {
            cnt = cnt + p->data%2;
      }
      return cnt;
}

(4)输出单向链表最大值

#include <stdio.h>
#include <stdlib.h>
#define N 5
typedef struct node
{
      int data;
      struct node * next;
}ElemSN;
ElemSN * Createlink1(int a[]);
ElemSN * Pmaxnode(ElemSN *h);
int main()
{
      int a[N] = {10,20,30,40,50};
      ElemSN *head = NULL;
      ElemSN *p;
      head = Createlink1(a);
      p = Pmaxnode(head);
      printf("max = %d",p->data);

      printf("\n");

      return 0;
}
ElemSN * Createlink1(int a[])
{
      ElemSN *h,*tail,*p;
      int i;
      h = tail = (ElemSN *)malloc(sizeof(ElemSN));
      h->data = a[0];
      h->next = NULL;
      for(i = 1;i < N;i++)
      {
            p = (ElemSN *)malloc(sizeof(ElemSN));
            p->data = a[i];
            p->next = NULL;
            tail->next = p;
            tail = p;
      }
      return h;
}
ElemSN * Pmaxnode(ElemSN *h)
{
      ElemSN *pmax,*p;
      pmax = p = h;
      for(p = h->next;p;p = p->next)
      {
            if(pmax->data < p->data)
            {
                  pmax = p;
            }
      }
      return pmax;
}

(5)逆向输出单向链表

#include <stdio.h>
#include <stdlib.h>
#define N 5
typedef struct node
{
      int data;
      struct node * next;
}ElemSN;
ElemSN * Createlink1(int a[]);
void * Printlink(ElemSN *h);
int main()
{
      int a[N] = {10,20,30,40,50};
      ElemSN *head = NULL;
      head = Createlink1(a);
      Printlink(head);

      printf("\n");

      return 0;
}
ElemSN * Createlink1(int a[])
{
      ElemSN *h,*tail,*p;
      int i;
      h = tail = (ElemSN *)malloc(sizeof(ElemSN));
      h->data = a[0];
      h->next = NULL;
      for(i = 1;i < N;i++)
      {
            p = (ElemSN *)malloc(sizeof(ElemSN));
            p->data = a[i];
            p->next = NULL;
            tail->next = p;
            tail = p;
      }
      return h;
}
void * Printlink(ElemSN *h)
{
      ElemSN *p,*pend = NULL;
      while(pend != h)
      {
            for(p = h;p->next != pend;p = p->next);
            printf("%d ",p->data);
            pend = p;
      }
      return pend;
}

 

终极版:合并为一个函数

#include <stdio.h>
#include <stdlib.h>
#define N 5
typedef struct node
{
      int data;
      struct node *next;
}ElemSN;
//以下对应函数在主函数后按顺序排列
ElemSN *Createlink1(int a[]);
ElemSN *Ptailnode(ElemSN *h);
int Countnode(ElemSN *h);
int CountOdd(ElemSN *h);
ElemSN *Maxnode(ElemSN *h);
void Printlink(ElemSN *h);
int main()
{
      int a[N] = {1,2,3,4,5};
      ElemSN *head = NULL;
      ElemSN *ptail,*Pmax;
      int count,countOdd;
      //创建单向链表
      head = Createlink1(a);
      //输出尾结点的值
      ptail = Ptailnode(head);
      printf("尾结点的值是:%d\n",ptail->data);
      //输出总结点数
      count = Countnode(head);
      printf("总结点个数为:%d\n",count);
      //输出节点数据域中存储的是奇数的节点个数
      countOdd = CountOdd(head);
      printf("存的数是奇数的节点数共有%d个\n",countOdd);
      //输出单向链表中的最大值
      Pmax = Maxnode(head);
      printf("最大节点max = %d\n",Pmax->data);
      //逆向输出单向链表
      printf("逆向顺序输出结果为:");
      Printlink(head);
      printf("\n");

      return 0;
}
//创建链表
ElemSN *Createlink1(int a[])
{
      ElemSN *h = NULL,*tail,*p;
      for(int i = 0;i < N;i++)
      {
            p = (ElemSN *)malloc(sizeof(ElemSN));
            p->data = a[i];
            p ->next = NULL;
            if(!h)
            {
                  h = tail = p;
            }
            else
            {
                  tail= tail->next = p;  //先连接后挪指针
            }
      }
      return h;
}
//求尾结点的值
ElemSN *Ptailnode(ElemSN *h)
{
      ElemSN *p;
      for(p = h;p->next;p = p->next);
            return p;
}
//求节点的个数
int Countnode(ElemSN *h)
{
      int cnt = 0;
      ElemSN *p;
      for(p = h; p ;cnt++, p = p ->next);
      return cnt;
}
//求数据域中值为奇数的节点个数
int CountOdd(ElemSN *h)
{
      int cnt = 0;
      ElemSN *p;
      for(p = h;p;p = p->next)
      {
            cnt = cnt + p->data % 2; // cnt += p->data % 2
      }
      return cnt;
}
//求节点中的最大值
ElemSN *Maxnode(ElemSN *h)
{
      ElemSN *pmax,*p;
      pmax = h;
      for(p = h->next;p;p = p->next) 
      {
            if(pmax->data < p->data)
            {
                  pmax = p;
            }
      }
            return pmax;
}
//逆向输出链表
void Printlink(ElemSN *h)
{
      ElemSN *p,*pend = NULL;
      while(pend != h)
      {
            for(p = h;p->next != pend;p = p->next);
            printf("%d ",p->data);
            pend = p;
      }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值