今天繼續學習了鏈表,這次是檢測鏈表是否為空,計算鏈表長度,這都是蠻簡單的,最后就是給鏈表排序,這里的鏈表排序是當然是最簡單的冒泡排序。
還是希望和新手一起學習,希望得到大牛指點······
這次代碼還是基於上次 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 ;
鏈表創建,遍歷,檢測是否為空,計算鏈表長度,排序
編譯環境: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 ;
}
歡迎大神指正批評·······新手一起學習······