欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言單鏈表的實現(xiàn)

 更新時間:2016年04月13日 14:28:37   作者:Lynn-Zhang  
單鏈表是一種鏈?zhǔn)酱嫒〉臄?shù)據(jù)結(jié)構(gòu),用一組地址任意的存儲單元存放線性表中的數(shù)據(jù)元素。這篇文章主要介紹了C語言單鏈表的實現(xiàn) 的相關(guān)資料,需要的朋友可以參考下

單鏈表是一種鏈?zhǔn)酱嫒〉臄?shù)據(jù)結(jié)構(gòu),用一組地址任意的存儲單元存放線性表中的數(shù)據(jù)元素。

鏈表結(jié)構(gòu):

SList.h

#pragma once
typedef int DataType;
typedef struct SListNode
{
DataType data;
struct SListNode* next;
}SListNode;
// 如果要修改鏈表就必須加引用
SListNode* _BuyNode(DataType x); //建立節(jié)點
void PrintSlist(SListNode* pHead); //打印單鏈表
void PushBack(SListNode* & pHead, DataType x); //尾插 (這里用了引用,指明是list的別名,調(diào)用時傳參,不用傳地址)(引用在.c文件中不可用)
//void PushBack(SListNode** pHead, DataType x); // 這里的第一個參數(shù)指向鏈表第一個節(jié)點的指針的地址(調(diào)用時傳參,傳的是地址)
void PopBack(SListNode* & pHead); //尾刪
void PushFront(SListNode* & pHead, DataType x); //頭插
void PopFront(SListNode* & pHead); //頭刪
void DestoryList(SListNode*& pHead); //清空整個鏈表
int GetSize(SListNode* pHead); //獲取鏈表長度
SListNode* Find(SListNode* pHead, DataType x); //查找
void Insert(SListNode* pos, DataType x); //某位置后插入數(shù)據(jù)
void Erase(SListNode*& pHead, SListNode* pos); //刪除某位置的數(shù)據(jù)
void DelNonTailNode(SListNode* pos); //刪除一個無頭單鏈表的非尾節(jié)點
void InsertFrontNode(SListNode* pos, DataType x); // 在無頭單鏈表的一個非頭節(jié)點前插入一個節(jié)點
SListNode* FindMidNode(SListNode* pHead); //查找中間節(jié)點
SListNode* FindKNode(SListNode* pHead, int k); //查找倒數(shù)第k個節(jié)點(要求只能遍歷一次)
void PrintTailToHead(SListNode* pHead); //倒著打印單鏈表(遞歸)
//SListNode* Reverse_(SListNode* pHead); //逆置單鏈表(需要接收返回值),原鏈表會面目全非
void Reverse(SListNode*& pHead); // 將原鏈表逆置
SListNode* Merge(SListNode* pHead1, SListNode* pHead2); //合并兩個有序鏈表(合并后依然有序)(遞歸)
void Sort(SListNode* pHead); //冒泡排序

SList.cpp

#include"SList.h"
#include <stdio.h>
#include<assert.h>
#include <malloc.h>
SListNode* _BuyNode(DataType x) //建立節(jié)點
{
SListNode* tmp = (SListNode*)malloc(sizeof(SListNode));
tmp->data = x;
tmp->next = NULL;
return tmp;
}
void PrintSlist(SListNode* pHead) // 打印單鏈表
{
SListNode* cur = pHead;
while (cur)
{
printf("%d->", cur->data);
cur = cur->next;
}
printf("NULL\n");
}
//void PushBack(SListNode** ppHead, DataType x) //尾插
//{
// assert(ppHead);
// // 1.空
// // 2.不為空
// if(*ppHead == NULL)
// {
// *ppHead = _BuyNode(x);
// }
// else
// {
// // 找尾
// SListNode* tail = *ppHead;
// while(tail->next != NULL)
// {
// tail = tail->next;
// }
//
// tail->next = _BuyNode(x);
// }
//}
void PushBack(SListNode* & pHead, DataType x) //尾插
{
// 1.空
// 2.不為空
if (pHead == NULL)
{
pHead = _BuyNode(x);
}
else
{
// 找尾
SListNode* tail = pHead;
while (tail->next != NULL)
{
tail = tail->next;
}
tail->next = _BuyNode(x);
}
}
void PopBack(SListNode* & pHead) // 尾刪
{
//
// 1.空
// 2.一個節(jié)點
// 3.多個節(jié)點
//
if (pHead == NULL)
{
return;
}
else if (pHead->next == NULL)
{
free(pHead);
pHead = NULL;
}
else
{
SListNode* tail = pHead;
SListNode* prev = NULL;
while (tail->next)
{
prev = tail;
tail = tail->next;
}
free(tail);
prev->next = NULL;
}
}
void PushFront(SListNode* & pHead, DataType x) //頭插
{
// 1.空
// 2.不空
if (pHead == NULL)
{
pHead = _BuyNode(x);
}
else
{
SListNode* tmp = _BuyNode(x);
tmp->next = pHead;
pHead = tmp;
}
}
void PopFront(SListNode*& pHead) //頭刪
{
//
// 1.空
// 2.一個節(jié)點
// 3.一個以上的節(jié)點
//
if (pHead == NULL)
{
return;
}
else if (pHead->next == NULL)
{
free(pHead);
pHead = NULL;
}
else
{
SListNode* tmp = pHead;
pHead = pHead->next;
free(tmp);
}
}
void DestoryList(SListNode*& pHead) //清空整個鏈表
{
SListNode* cur = pHead;
while (cur)
{
SListNode* tmp = cur;
cur = cur->next;
free(tmp);
}
pHead = NULL;
}
int GetSize(SListNode* pHead) //獲取鏈表長度
{
assert(pHead);
SListNode* cur = pHead;
int count = 0;
while (cur)
{
count++;
cur = cur->next;
}
return count;
}
SListNode* Find(SListNode* pHead, DataType x) //查找節(jié)點
{
SListNode* cur = pHead;
while (cur)
{
if (cur->data == x)
{
return cur;
}
cur = cur->next;
}
return NULL;
}
void Insert(SListNode* pos, DataType x) // 某位置后插入節(jié)點
{
assert(pos);
SListNode* tmp = _BuyNode(x);
tmp->next = pos->next;
pos->next = tmp;
}
void Erase(SListNode*& pHead, SListNode* pos) //刪除某位置的節(jié)點
{
assert(pos);
assert(pHead);
//pos為頭結(jié)點
if (pHead == pos)
{
pHead = pHead->next;
free(pos);
return;
}
////
SListNode* prev = pHead;
while (prev)
{
if (prev->next == pos)
{
prev->next = pos->next;
free(pos);
break;
}
prev = prev->next;
}
}
void DelNonTailNode(SListNode* pos) //// 刪除一個無頭單鏈表的非尾節(jié)點
{
assert(pos);
assert(pos->next);
SListNode* del = pos->next;
SListNode* dnext = del->next;
pos->data = del->data;
pos->next = dnext;
free(del);
}
void InsertFrontNode(SListNode* pos, DataType x) // 在無頭單鏈表的一個非頭節(jié)點前插入一個節(jié)點
{
assert(pos);
SListNode* tmp = _BuyNode(pos->data);
tmp->next = pos->next;
pos->next = tmp;
pos->data = x;
}
void Sort(SListNode* pHead) //冒泡排序
{
assert(pHead);
int size = GetSize(pHead);
for (int i = 0; i < size - 1; i++)
{
SListNode* left = pHead;
SListNode* right = pHead->next;
for (int j = 0; j < size - i - 1; j++)
{
if (left->data>right->data)
{
int tmp = left->data;
left->data = right->data;
right->data = tmp;
}
right = right->next;
left = left->next;
}
}
}
SListNode* FindMidNode(SListNode* pHead) //查找中間節(jié)點
{
SListNode* fast = pHead;
SListNode* slow = pHead;
while (fast&&fast->next)
{
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
SListNode* FindKNode(SListNode* pHead, int k) //查找倒數(shù)第k個節(jié)點
{
SListNode* fast = pHead;
SListNode* slow = pHead;
while (fast && k--)
{
fast = fast->next;
}
if (k > 0)
{
return NULL;
}
while (fast)
{
slow = slow->next;
fast = fast->next;
}
return slow;
}
void PrintTailToHead(SListNode* pHead) //倒著打印單鏈表(遞歸)
{
if (pHead)
{
PrintTailToHead(pHead->next);
printf("%d ", pHead->data);
}
}
//SListNode* Reverse_(SListNode* pHead) //逆置單鏈表(需要接收返回值)原鏈表會面目全非
//{
// SListNode* cur = pHead;
// SListNode* newHead = NULL;
// while (cur)
// {
// SListNode* tmp = cur;
// cur = cur->next;
// tmp->next = newHead;
// newHead = tmp;
// }
// return newHead;
//}
void Reverse(SListNode*& pHead) //逆置單鏈表
{
SListNode* cur = pHead;
SListNode* newHead = NULL;
while (cur)
{
SListNode* tmp = cur;
cur = cur->next; 
tmp->next = newHead;
newHead = tmp;
}
pHead = newHead;
//return newHead;
}
SListNode* Merge(SListNode* pHead1, SListNode* pHead2) //合并兩個有序鏈表(合并后依然有序)遞歸
{
if (pHead1 == NULL)
return pHead2;
else if (pHead2 == NULL)
return pHead1;
SListNode* pMergedHead = NULL;
if (pHead1->data < pHead2->data)
{
pMergedHead = pHead1;
pMergedHead->next = Merge(pHead1->next, pHead2);
}
else
{
pMergedHead = pHead2;
pMergedHead->next = Merge(pHead1, pHead2->next);
}
return pMergedHead;
}

Test.cpp

#include "SList.h"
#include<stdlib.h>
void Test1()
{
// 尾插 打印 尾刪 頭插 頭刪 清空鏈表
SListNode* list = NULL;
PushBack(list, 1);
PushBack(list, 2);
PushBack(list, 3);
PushBack(list, 4);
PrintSlist(list);
PopBack(list);
PrintSlist(list);
PushFront(list,0);
PrintSlist(list);
PopFront(list);
PrintSlist(list);
DestoryList(list);
PrintSlist(list);
}
void Test2()
{
// 查找節(jié)點 在某位置插入節(jié)點 刪除某位置節(jié)點 
SListNode* list = NULL;
PushBack(list, 1);
PushBack(list, 2);
PushBack(list, 3);
PushBack(list, 4);
PrintSlist(list);
SListNode* pos = Find(list, 2);
Insert(pos, 0);
PrintSlist(list);
Erase(list, Find(list, 0));
PrintSlist(list);
}
void Test3()
{
SListNode* list = NULL;
PushBack(list, 1);
PushBack(list, 2);
PushBack(list, 3);
PushBack(list, 4);
PushBack(list, 5);
PushBack(list, 6);
PrintSlist(list);
// 刪除一個無頭單鏈表的非尾節(jié)點 
/*SListNode* pos = Find(list, 2);
DelNonTailNode(pos);
PrintSlist(list);*/
// 在無頭單鏈表的一個非頭節(jié)點前插入一個節(jié)點
/*SListNode* pos = Find(list, 2);
InsertFrontNode(pos, 0);
PrintSlist(list);*/
//查找中間節(jié)點
//PrintSlist(FindMidNode(list));
//查找倒數(shù)第k個節(jié)點
//SListNode* ret = FindKNode(list, 2);
//PrintSlist(ret);
//倒著打印單鏈表(遞歸)
//PrintTailToHead(list);
//逆置單鏈表
//SListNode* ret = Reverse(list);
//PrintSlist(ret);
//PrintSlist(Reverse_(list));
}
void Test4()
{ //合并兩個有序鏈表(合并后依然有序)
SListNode* list = NULL;
PushBack(list, 4);
PushBack(list, 2);
PushBack(list, 1);
PushBack(list, 4);
PrintSlist(list);
Sort(list);
PrintSlist(list);
/*SListNode* list1 = NULL;
PushBack(list1, 2);
PushBack(list1, 3);
PushBack(list1, 3);
PushBack(list1, 0);
PrintSlist(list);
Sort(list1);
PrintSlist(list1);
SListNode* ret = Merge(list, list1);
PrintSlist(ret);
PrintSlist(list);
PrintSlist(list1);*/
}
int main()
{
//Test1();
//Test2();
//Test3();
Test4();
system("pause");
return 0;
}

以上內(nèi)容是小編給大家介紹的C語言單鏈表的實現(xiàn)代碼,希望對大家有所幫助!

相關(guān)文章

  • C語言二維數(shù)組指針的概念及使用

    C語言二維數(shù)組指針的概念及使用

    C語言中的二維數(shù)組是按行排列的,也就是先存放a[0]行,再存放a[1]行,最后存放a[2]行;每行中的4個元素也是依次存放。數(shù)組a為int類型,每個元素占用4個字節(jié),整個數(shù)組共占用48個字節(jié)
    2023-02-02
  • Qt連接MySQL數(shù)據(jù)庫的實現(xiàn)(保姆級成功版教程)

    Qt連接MySQL數(shù)據(jù)庫的實現(xiàn)(保姆級成功版教程)

    本文主要介紹了Qt連接MySQL數(shù)據(jù)庫的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • C++實現(xiàn)日期類(Date)

    C++實現(xiàn)日期類(Date)

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)日期類的相關(guān)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • c++友元函數(shù)與友元類的深入解析

    c++友元函數(shù)與友元類的深入解析

    友元函數(shù)的特點是能夠訪問類中的私有成員的非成員函數(shù)。友元函數(shù)從語法上看,它與普通函數(shù)一樣,即在定義上和調(diào)用上與普通函數(shù)一樣
    2013-07-07
  • C++模擬實現(xiàn)vector示例代碼圖文講解

    C++模擬實現(xiàn)vector示例代碼圖文講解

    這篇文章主要介紹了C++容器Vector的模擬實現(xiàn),Vector是一個能夠存放任意類型的動態(tài)數(shù)組,有點類似數(shù)組,是一個連續(xù)地址空間,下文更多詳細(xì)內(nèi)容的介紹,需要的小伙伴可以參考一下
    2023-02-02
  • C語言將24小時制轉(zhuǎn)換為12小時制的方法

    C語言將24小時制轉(zhuǎn)換為12小時制的方法

    這篇文章主要介紹了C語言將24小時制轉(zhuǎn)換為12小時制的方法,涉及C語言針對時間的相關(guān)操作技巧,非常簡單實用,需要的朋友可以參考下
    2015-07-07
  • C++實現(xiàn)簡單校園導(dǎo)游系統(tǒng)

    C++實現(xiàn)簡單校園導(dǎo)游系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)簡單校園導(dǎo)游系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C/C++指針小結(jié)

    C/C++指針小結(jié)

    要搞清一個指針需要搞清指針的四方面的內(nèi)容:指針的類型,指針?biāo)赶虻念愋?,指針的值或者叫指針?biāo)赶虻膬?nèi)存區(qū),還有指針本身所占據(jù)的內(nèi)存區(qū)
    2013-09-09
  • C/C++?Qt?數(shù)據(jù)庫與ComBox實現(xiàn)多級聯(lián)動示例代碼

    C/C++?Qt?數(shù)據(jù)庫與ComBox實現(xiàn)多級聯(lián)動示例代碼

    Qt中的SQL數(shù)據(jù)庫組件可以與ComBox組件形成多級聯(lián)動效果,在日常開發(fā)中多級聯(lián)動效果應(yīng)用非常廣泛,今天給大家分享二級ComBox菜單如何與數(shù)據(jù)庫形成聯(lián)動,本文通過實例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-12-12
  • C語言進(jìn)階學(xué)習(xí)之指針

    C語言進(jìn)階學(xué)習(xí)之指針

    關(guān)于指針,其是C語言的重點,C語言學(xué)的好壞,其實就是指針學(xué)的好壞。其實指針并不復(fù)雜,學(xué)習(xí)指針,要正確的理解指針,本片文章能給就來學(xué)習(xí)一下
    2021-09-09

最新評論