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