1. 程式人生 > >【郝斌資料結構自學筆記】26_通過連結串列排序演算法的演示再次詳細討論到底什麼是演算法以及到底什麼是泛型【重點】

【郝斌資料結構自學筆記】26_通過連結串列排序演算法的演示再次詳細討論到底什麼是演算法以及到底什麼是泛型【重點】

26_通過連結串列排序演算法的演示再次詳細討論到底什麼是演算法以及到底什麼是泛型【重點】


演算法:

狹義的演算法是與資料的儲存方式密切相關

廣義的演算法是與資料的儲存方式無關

泛型:

利用某種技術達到的效果就是:不同的儲存方式,執行的操作是一樣的

#include<stdio.h>

#include<malloc.h>

#include<stdlib.h>

typedefstruct Node

{

         int data;//資料域

         struct Node * pNext;//指標域

}NODE,*PNODE;//NODE等價於structNode,PNODE等價於struct Node *

//函式宣告

PNODEcreate_list(void);

voidtraverse_list(PNODE pHead);

boolis_empty(PNODE pHead);

intlength_list(PNODE);

boolinsert_list(PNODE,int,int);

booldelete_list(PNODE,int,int*);

voidsort_list(PNODE);

intmain(void)

{

         PNODE pHead=NULL;//等價於structNode *pHead=NULL;

         pHead=create_list();//creat_list()功能:建立一個非迴圈單鏈表,並將該連結串列的頭節點的地址付給pHead

         traverse_list(pHead);

         int len=length_list(pHead);

         printf("連結串列長度是%d\n",len);

         if(is_empty(pHead))

                   printf("連結串列為空!\n");

         else

                   printf("連結串列不空!\n");

         sort_list(pHead);

         traverse_list(pHead);

         return 0;

}

PNODEcreate_list(void)

{

         int len;//用來存放有效節點的個數

         int i;

         int val;//用來臨時存放使用者輸入的節點的值

         //分配了一個不存放有效資料的頭節點

         PNODEpHead=(PNODE)malloc(sizeof(NODE));

         if(NULL==pHead)

         {

                   printf("分配失敗,程式終止!\n");

                   exit(-1);

         }

         PNODE pTail=pHead;

         pTail->pNext=NULL;

         printf("請輸入您需要生成的連結串列節點的個數:len=");

         scanf("%d",&len);

         for (i=0;i<len;i++)

         {

                   printf("請輸入第%d個節點的值:",i+1);

                   scanf("%d",&val);

                   PNODEpNew=(PNODE)malloc(sizeof(NODE));

                   if(NULL==pNew)

                   {

                            printf("分配失敗,程式終止!\n");

                            exit(-1);

                   }

                   pNew->data=val;//掛

                   pTail->pNext=pNew;

                   pNew->pNext=NULL;

                   pTail=pNew;

         }

         return pHead;

}

voidtraverse_list(PNODE pHead)

{

         PNODE p=pHead->pNext;

         while(NULL!=p)

         {

                   printf("%d",p->data);     

                   p=p->pNext;//不連續,不能用p++

         }

         printf("\n");

         return;

}

boolis_empty(PNODE pHead)

{

         if(pHead->pNext==NULL)

                   return true;

         else

                   return false;

}

intlength_list(PNODE pHead)

{

         PNODE p=pHead->pNext;

         int len=0;

         while(NULL!=p)

         {

                   len++;

                   p=p->pNext;

         }

         return len;

}

voidsort_list(PNODE pHead)

{

         int i,j,t;

         int len=length_list(pHead);

         PNODE p,q;

         for(i=0,p=pHead->pNext;i<len-1;++i,p=p->pNext)

         {

                   for(j=i+1,q=p->pNext;j<len;++j,q=q->pNext)

                   {

                            if(p->data>q->data)//類似於陣列中的:a[i]>a[j]

                            {

                                     t=p->data;//類似於陣列中的:     t=a[i];

                                     p->data=q->data;//類似於陣列中的: a[i]=a[j];

                                     q->data=t;//類似於陣列中的:     a[j]=t;

                            }

                   }

         }

}