#include<stdlib.h>
# define N 10
typedef struct node{
int data;
struct node * next;
} ElemSN;
ElemSN * GreatLink1(int a[],int n){
ElemSN *h,*t,*p;
int i;
//正向創建頭結點
h=t=(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;
t->next=p;
t=p;
}
return h;
}
ElemSN * GreatLink2(int a[]){
ElemSN *h,*p;
int i;
//反向創建頭結點
h=NULL;
for(i=N-1;i>-1;i--)
{
p=(ElemSN *)(malloc(sizeof (ElemSN)));
p->data=a[i];
p->next=h;
h=p;
}
return h;
}
//輸出鏈表
void PrintLink(ElemSN *h){
ElemSN *p;
for(p=h;p!=NULL;p=p->next)
printf("%5d",p->data);
}
//輸出鏈表中奇數位點
void Outobb(ElemSN *h){
ElemSN *p;
int i=1;
for(p=h;p;p=p->next,i++)
{
if(i%2)
printf("%5d",p->data);
}
printf("\n");
}
//逆向輸出鏈表
void Exchange(ElemSN *h){
ElemSN *p,*end;
end=NULL;
while(end-h)
{
for(p=h;(p->next)-end;p=p->next);
printf("%5d",p->data);
end=p;
}
printf("\n");
}
//返回單向鏈表個數
int Number(ElemSN * h){
ElemSN *p;
int i=0;
for(p=h;p;p=p->next,i++);
return i;
}
//返回單向鏈表奇數個數
int ObbNumber(ElemSN *h){
ElemSN *p;
int i=0;
for(p=h;p;p=p->next)
i=i+p->data%2;
return i;
}
//返回最大值及個數
void MaxNumber(ElemSN *h){
ElemSN *p;
int i,max;
i=0;
max=h->data;
for(p=h;p;p=p->next)
{
if((p->data)>max)
max=p->data;
}
for(p=h;p;p=p->next)
{
if(p->data==max)
i++;
}
printf("輸出最大值:%d\n",max);
printf("輸出最大值個數:%d\n",i);
}
//交換頭結點和尾節點數據域值
void ChangeFL(ElemSN *h)
{
ElemSN *p;
int t;
for(p=h;p->next;p=p->next);
t=p->data;
p->data=h->data;
h->data=t;
}
//交換頭尾節點
void ChangeFLD(ElemSN *h)
{
ElemSN *p,*q,*t;
t=h->next;
for(p=h,q=h->next;q;q=q->next,q=q->next,p=p->next);
q->next=t;
p->next=h;
h->next=NULL;
h=t;
}
int main(void)
{
int a[N]={7,2,9,4,7,8,9,14,11,14};
ElemSN * head;
int n,obbn;
head=NULL;;
head=GreatLink2(a,10);
printf("輸出鏈表:");
PrintLink(head);
printf("\n");
n=Number(head);
printf("返回單向鏈表個數:%d\n",n);
obbn=ObbNumber(head);
printf("返回單向鏈表奇數個數:%d\n",obbn);
printf("輸出鏈表中奇數位:");
Outobb(head);
printf("逆向輸出鏈表:");
Exchange(head);
//返回最大值及個數
MaxNumber(head);
printf("交換頭結點和尾節點數據域值:");
ChangeFL(head);
PrintLink(head);
printf("\n");
printf("交換頭結點和尾節點:");
ChangeFLD(head);
PrintLink(head);
printf("\n");
return 0;
}