链表的遍历(打印链表所有结点的值 ,返回链表的尾结点,输出该链表的结点个数,输出最大值结点的值)

#include<stdio.h>
#include<stdlib.h> 
#define N 10
typedef struct node{
	int data;
	struct node* next;
}ElemSN;

//创建一个单向链表 
ElemSN* CreatLink(int a[],int n)
{
	ElemSN *head,*tail,*p;
	head=NULL;
	for(int i=0;i<n;i++)
	{
		p=(ElemSN*)malloc(sizeof(ElemSN));
		p->data=a[i];
		p->next=NULL;
		if(!head)
	    {
	    	head=tail=p;
	    	tail->next=NULL;
		}
	    else
	    {
	    	tail=tail->next=p;
	    	tail->next=NULL;
		}
	}
	return head;
 } 
 
 
 //打印该链表所有结点的值 
  void PrintLink(ElemSN* head)
 {
 	ElemSN *p=head;
 	for(;p;p=p->next)
 	printf("%5d",p->data);
 }
 
 
//返回单向链表尾节点并输出
ElemSN* TailNode(ElemSN *head)
{
	ElemSN *p;
	for(p=head;p&&p->next;p=p->next);
	return p;
}


//输出结点个数
int CountNode(ElemSN *head)
{
	ElemSN *p;
	int count=0;
	for(p=head;p;p=p->next)
	count++;
	return count;
}


//输出数据域值为奇数的结点个数
int CountOddNode(ElemSN *head)
{
	int count=0;
	ElemSN *p;
	for(p=head;p;p=p->next)
	{
		if(p->data%2)
		count++;
	}
	return count;
}


//返回该链表数据域值最大的结点并输出该结点的值 
ElemSN* MaxNode(ElemSN *head)
{
	ElemSN *p,*pmax;
	pmax=head;
	for(p=head->next;p;p=p->next)
	if(pmax->data<p->data)
	pmax=p;
	return pmax;
 } 


//逆序输出这个链表 
void PrePrintLink(ElemSN *head)
{
	ElemSN *p,*pend;
	pend=NULL;
	while(head-pend)
	{
		for(p=head;p->next-pend;p=p->next);
		printf("%5d",p->data);
		pend=p;
	}
}

int main(void)
 {
 	ElemSN *head,*tail,*pmax;
 	int Count,CountOdd;
 	int a[N]={3,2,5,8,4,7,6,9,0,10};
 	head=CreatLink(a,N);  //创建单向链表,返回头指针 
 	PrintLink(head);   //打印该链表所有的值 
 	printf("\n");  //换行
	  
 	tail=TailNode(head);       //返回该链表的尾结点 
 	printf("该链表尾节点数据域的值为:%d\n",tail->data);  //打印该链表尾结点的值 
 	
 	Count=CountNode(head);  
 	printf("该链表一共有%d个结点\n",Count);   //输出该链表的结点个数 
 	
 	CountOdd=CountOddNode(head);     
 	printf("该链表数据域的值为奇数的结点个数为:%d\n",CountOdd); //输出数据域值为奇数的结点个数
 	
 	pmax=MaxNode(head);   //返回链表中数据域值最大的结点 
 	printf("该链表所有结点中数据域最大的值为:%d\n",pmax->data);  //输出该最大值结点的值
 	
 	PrePrintLink(head); //逆序输出该链表 
	  
 }

猜你喜欢

转载自blog.csdn.net/qq_39241239/article/details/80882370