數據結構基礎算法-鏈表

#include<stdio.h> #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; }