【數據結構】C語言判斷鏈表是否為空,計算鏈表長度及鏈表排序算法


      今天繼續學習了鏈表,這次是檢測鏈表是否為空,計算鏈表長度,這都是蠻簡單的,最后就是給鏈表排序,這里的鏈表排序是當然是最簡單的冒泡排序。

還是希望和新手一起學習,希望得到大牛指點······

      這次代碼還是基於上次 C語言實現鏈表的創建及遍歷鏈表這個文章中的代碼,直接在這上面寫的,添加的,檢測是否為空函數,計算鏈表長度函數,和鏈表排序函數,好了,上代碼了。


/*
            鏈表創建,遍歷,檢測是否為空,計算鏈表長度,排序

       編譯環境:VC++ 6.0
       編譯系統:windows XP SP3
*/

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

//     定義鏈表中的節點
typedef  struct node
{
     int member;                 //     節點中的成員
     struct node *pNext;         //     指向下一個節點的指針
}Node,*pNode;

//     函數聲明
pNode CreateList();                  //   創建鏈表函數
void TraverseList(pNode );             //   遍歷鏈表函數
bool Is_Empty(pNode);                 //     判斷鏈表是否為空
int LengthList(pNode);                 //     計算鏈表長度函數    
void Sort_List(pNode);                 //     鏈表排序函數

int main()
{
    pNode pHead = NULL;                 //   定義初始化頭節點,等價於 struct Node *pHead == NULL
     int flag;                         //     存放鏈表是否為空的標志,
     int Len;
    pHead = CreateList();             //   創建一個非循環單鏈表,並將該鏈表的頭結點的地址付給pHead
    TraverseList(pHead);             //   調用遍歷鏈表函數
     if (Is_Empty(pHead) ==  true)     //     判斷列表是否為空
    {
         return  0;
    }
    Len = LengthList(pHead);                 //     調用計算鏈表長度函數
    printf( " 鏈表長度: %d 個節點。\n ",Len);    
    Sort_List(pHead);                 //     排序函數
    
     return  0;
}

//     創建鏈表函數
pNode CreateList()
{
     int i;                                             //     用於下面循環
     int len;                                         //     用來存放有效節點的字數
     int val;                                         //     用於臨時存放用戶輸入的數據
    pNode pHead = (pNode)malloc( sizeof(Node));         //   分配一個不存放有效數據的頭結點
    pNode pTail = pHead;                             //     鏈表的最后一個節點
    pTail->pNext = NULL;                             //     最后一個節點的指針置為空
    printf( " 請輸入節點個數: ");
    scanf( " %d ",&len);
     for(i =  0; i < len; i++)
    {
        printf( " 第 %d 個節點的數值: ",i+ 1);
        scanf( " %d ",&val);
        pNode pNew = (pNode)malloc( sizeof(Node));     //     為節點分配空間
        pNew->member = val;                             // 將用戶輸入的數據賦給節點的成員
        pTail->pNext = pNew;                         // 將最后一個節點的指針指向下一個新的節點
        pNew->pNext = NULL;                             // 將新節點中的指針置為空
        pTail = pNew;                                 // 將新節點賦給最后的一個節點
    }
     return pHead;                                     // 返回頭節點

}

//     遍歷鏈表函數
void TraverseList(pNode pHead)
{
    pNode p = pHead->pNext;                             // 將頭節點的指針給予臨時節點p
     while(NULL != p)                                 // 節點p不為空,循環    
    {
        printf( " %d  ",p->member);                    
        p = p->pNext;                                
    }
    printf( " \n ");
     return ;
}

//     判斷鏈表是否為空
bool Is_Empty(pNode pHead)
{
     if (NULL == pHead->pNext)                         // 判斷頭節點的指針部分是否為空
    {
        printf ( " 鏈表為空!\n ");
         return  true;
    }
     else
    {
         return  false;
    }
}

//     計算鏈表長度--------是不是發現和遍歷鏈表函數很像
int LengthList(pNode pHead)
{
     int length =  0;
    pNode n = pHead->pNext;
     while(NULL != n)
    {
        ++length;
        n = n->pNext;
    }
     return length;
}

//     鏈表排序-----冒泡排序
void Sort_List(pNode pHead)
{
     int i,j;        
     int swap;             // 存放交換數據的臨時變量
     int len = LengthList(pHead);     // 獲取鏈表長度
    pNode m,n;        
    
     for (i =  0,m = pHead->pNext; i < len -  1; i++,m = m->pNext)
    {
         for (j = i +  1,n = m->pNext;j < len; j++,n = n->pNext)
        {
             if (m->member < n->member)                    
            {
                swap = m->member;
                m->member = n->member;
                n->member = swap;
            }
        }
    }
    printf( " 排序完后結果為: ");
    TraverseList(pHead);
     return ;


歡迎大神指正批評·······新手一起學習······ 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM