最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言 數(shù)據(jù)結構之鏈表實現(xiàn)代碼

 更新時間:2016年10月11日 10:38:55   投稿:lqh  
這篇文章主要介紹了C語言 數(shù)據(jù)結構之鏈表實現(xiàn)代碼的相關資料,需要的朋友可以參考下

前言

最近在復習數(shù)據(jù)結構的相關知識,感覺在初學的時候還是有很多東西沒有掌握,不過現(xiàn)在終于算是搞得比較有頭緒了,所以就在寫出來和大家一起分享!

什么是鏈表

簡單的說,鏈表就是由多個結點離散分配,彼此通過指針相連,每個結點只有一個前驅(qū)結點和后繼結點。首節(jié)點無前驅(qū)結點,為結點無后繼結點的一種存儲結構。

鏈表的結構


頭結點:鏈表的第一個有效結點前面的結點,頭結點并不存放有效數(shù)據(jù),也就是數(shù)據(jù)域為空,加頭結點的主要目的是為了方便鏈表的操作。

首節(jié)點:鏈表的第一個有效結點,結點包含數(shù)據(jù)域和指針域。

尾結點:尾結點的指針域為空。

頭指針:指向頭結點的指針變量,它存放了頭結點的地址(在這里注意一下,指針變量存放的是地址,也就是說頭指針存放的是

頭結點的地址,一般通過頭指針對鏈表進行操作)。

具體實現(xiàn)

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
//定義鏈表節(jié)點
typedef struct Node
{
 int data;  //數(shù)據(jù)域
 struct Node * pNext; //指針域
}NODE, * PNODE;  //NODE等價于struct Node, PNODE等價于struct Node *
//函數(shù)聲明
PNODE createLinkList(void);    //創(chuàng)建鏈表的函數(shù)
void traverseLinkList(PNODE pHead);   //遍歷鏈表的函數(shù)
bool isEmpty(PNODE pHead);    //判斷鏈表是否為空的函數(shù)
int getLength(PNODE pHead);    //獲取鏈表長度的函數(shù)
bool insertElement(PNODE pHead, int pos, int val); //向鏈表中插入元素的函數(shù),三個參數(shù)依次為鏈表頭結點、要插入元素的位置和要插入元素的值
bool deleteElement(PNODE pHead, int pos, int * pVal); //從鏈表中刪除元素的函數(shù),三個參數(shù)依次為鏈表頭結點、要刪除的元素的位置和刪除的元素的值
void sort(PNODE pHead);     //對鏈表中的元素進行排序的函數(shù)(基于冒泡排序)
int main(void)
{
 int val;   //用于保存刪除的元素
 PNODE pHead = NULL;  //PNODE等價于struct Node *
 pHead = createLinkList(); //創(chuàng)建一個非循環(huán)單鏈表,并將該鏈表的頭結點地址賦給pHead
 traverseLinkList(pHead); //調(diào)用遍歷鏈表的函數(shù)
 if(isEmpty(pHead))
 printf("鏈表為空!\n");
 else
 printf("鏈表不為空!\n");
 printf("鏈表的長度為:%d\n", getLength(pHead));
 //調(diào)用冒泡排序函數(shù)
 sort(pHead);
 //重新遍歷
 traverseLinkList(pHead);
 //向鏈表中指定位置處插入一個元素
 if(insertElement(pHead, 4, 30))
 printf("插入成功!插入的元素為:%d\n", 30);
 else
 printf("插入失敗!\n");
 //重新遍歷鏈表
 traverseLinkList(pHead);
 //刪除元素測試
 if(deleteElement(pHead, 3, &val))
 printf("元素刪除成功!刪除的元素是:%d\n", val);
 else
 printf("元素刪除失敗!\n");
 traverseLinkList(pHead);
 system("pause");
 return 0;
}

PNODE createLinkList(void)
{
 int length; //有效結點的長度
 int i;
 int value; //用來存放用戶輸入的結點的值
 //創(chuàng)建了一個不存放有效數(shù)據(jù)的頭結點
 PNODE pHead = (PNODE)malloc(sizeof(NODE));
 if(NULL == pHead)
 {
 printf("內(nèi)存分配失敗,程序退出!\n");
 exit(-1);
 }
 PNODE pTail = pHead; //pTail始終指向尾結點
 pTail->pNext = NULL; //清空指針域
 printf("請輸入您想要創(chuàng)建鏈表結點的個數(shù):len = ");
 scanf("%d", &length);
 for(i=0;i<length;i++)
 {
 printf("請輸入第%d個結點的值:", i+1);
 scanf("%d", &value);
 PNODE pNew = (PNODE)malloc(sizeof(NODE));
 if(NULL == pHead)
 {
  printf("內(nèi)存分配失敗,程序退出!\n");
  exit(-1);
 }
 pNew->data = value; //向新結點中放入值
 pTail->pNext = pNew; //將尾結點指向新結點
 pNew->pNext = NULL; //將新結點的指針域清空
 pTail = pNew;  //將新結點賦給pTail,使pTail始終指向為尾結點
 }
 return pHead;
}

void traverseLinkList(PNODE pHead)
{
 PNODE p = pHead->pNext;
 while(NULL != p)
 {
 printf("%d ", p->data);
 p = p->pNext;
 }
 printf("\n");
 return;
}

bool isEmpty(PNODE pHead)
{
 if(NULL == pHead->pNext)
 return true;
 else
 return false;
}

int getLength(PNODE pHead)
{
 PNODE p = pHead->pNext;  //指向首節(jié)點
 int len = 0;   //記錄鏈表長度的變量
 while(NULL != p)
 {
 len++;
 p = p->pNext;  //p指向下一結點
 }
 return len;
}

void sort(PNODE pHead)
{
 int len = getLength(pHead); //獲取鏈表長度  
 int i, j, t;   //用于交換元素值的中間變量
 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)
  {
  t = p->data;
  p->data = q->data;
  q->data = t;
  }
 }
 }
 return;
}

bool insertElement(PNODE pHead, int pos, int val)
{
 int i = 0;
 PNODE p = pHead;
 //判斷p是否為空并且使p最終指向pos位置的結點
 while(NULL!=p && i<pos-1)
 {
 p = p->pNext;
 i++;
 }
 if(NULL==p || i>pos-1)
 return false;
 //創(chuàng)建一個新結點
 PNODE pNew = (PNODE)malloc(sizeof(NODE));
 if(NULL == pNew)
 {
 printf("內(nèi)存分配失敗,程序退出!\n");
 exit(-1);
 }
 pNew->data = val;
 //定義一個臨時結點,指向當前p的下一結點
 PNODE q = p->pNext;
 //將p指向新結點
 p->pNext = pNew;
 //將q指向之前p指向的結點
 pNew->pNext = q;
 return true;
}

bool deleteElement(PNODE pHead, int pos, int * pVal)
{
 int i = 0;
 PNODE p = pHead;
 //判斷p是否為空并且使p最終指向pos結點
 while(NULL!=p->pNext && i<pos-1)
 {
 p = p->pNext;
 i++;
 }
 if(NULL==p->pNext || i>pos-1)
 return false;
 //保存要刪除的結點
 * pVal = p->pNext->data;
 //刪除p后面的結點
 PNODE q = p->pNext;
 p->pNext = p->pNext->pNext;
 free(q);
 q = NULL;
 return true;
}

結尾語

上面實現(xiàn)的主要是單鏈表,另外還有雙鏈表、循環(huán)鏈表、非循環(huán)鏈表等其他幾種常見鏈表。雙鏈表的特殊性表現(xiàn)在每個基本結點有兩個指針域;循環(huán)鏈表的特性主要表現(xiàn)在,在循環(huán)鏈表中,通過任何一個結點可以找到其他所有結點。

謝謝大家的閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關文章

  • OpenSSL動態(tài)鏈接庫源碼安裝教程

    OpenSSL動態(tài)鏈接庫源碼安裝教程

    Openssl 是一個開放源代碼的SSL協(xié)議的產(chǎn)品實現(xiàn),它采用C語言作為開發(fā)語言,具備了跨系統(tǒng)的性能。這篇文章主要介紹了OpenSSL動態(tài)鏈接庫源碼安裝,需要的朋友可以參考下
    2021-11-11
  • C語言判斷字符串是否以str2開頭代碼

    C語言判斷字符串是否以str2開頭代碼

    這里給大家分享的是一個使用C語言實現(xiàn)的判斷字符串中是否以某字符開頭或者結尾的代碼,非常的簡單實用,希望大家能夠喜歡
    2017-05-05
  • C++數(shù)據(jù)結構哈希表詳解

    C++數(shù)據(jù)結構哈希表詳解

    C++標準庫中使用的unordered_map底層實現(xiàn)是哈希表,下面這篇文章主要給大家介紹了關于C++中使用哈希表(unordered_map)的一些常用操作方法,需要的朋友可以參考下
    2022-07-07
  • C++ std::any的模擬實現(xiàn)

    C++ std::any的模擬實現(xiàn)

    std::any是C++標準庫中的一個類,std::any對象可以存儲除單例等特殊情況外的任何類型的數(shù)據(jù),本文主要介紹了C++ std::any的模擬實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • Cocos2d-x學習筆記之世界坐標系、本地坐標系、opengl坐標系、屏幕坐標系

    Cocos2d-x學習筆記之世界坐標系、本地坐標系、opengl坐標系、屏幕坐標系

    這篇文章主要介紹了Cocos2d-x學習筆記之世界坐標系、本地坐標系、opengl坐標系、屏幕坐標系,本文用代碼和注釋講解了Cocos2d-x中的坐標體系,需要的朋友可以參考下
    2014-09-09
  • C++編程異常處理中try和throw以及catch語句的用法

    C++編程異常處理中try和throw以及catch語句的用法

    這篇文章主要介紹了C++編程異常處理中try和throw以及catch語句的用法,包括對Catch塊的計算方式的介紹,需要的朋友可以參考下
    2016-01-01
  • C++數(shù)據(jù)結構之二叉搜索樹的實現(xiàn)詳解

    C++數(shù)據(jù)結構之二叉搜索樹的實現(xiàn)詳解

    二叉搜索樹作為一個經(jīng)典的數(shù)據(jù)結構,具有鏈表的快速插入與刪除的特點,同時查詢效率也很優(yōu)秀,所以應用十分廣泛。本文將詳細講講二叉搜索樹的C++實現(xiàn),需要的可以參考一下
    2022-08-08
  • C語言編程數(shù)據(jù)結構基礎詳解小白篇

    C語言編程數(shù)據(jù)結構基礎詳解小白篇

    這篇文章主要介紹了數(shù)據(jù)結構的基礎,非常適合初學數(shù)據(jù)結構的小白,有需要的朋友可以借鑒參考下,希望可以有所幫助,祝大家多多進步,早日升職加薪
    2021-09-09
  • C語言 位段的詳細介紹

    C語言 位段的詳細介紹

    這篇文章主要介紹了C語言 位段的詳細介紹的相關資料,學習C語言基礎的朋友,可以參考本文,需要的朋友可以參考下
    2016-11-11
  • C++實現(xiàn)LeetCode(206.倒置鏈表)

    C++實現(xiàn)LeetCode(206.倒置鏈表)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(206.倒置鏈表),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07

最新評論

唐河县| 雷山县| 蒙城县| 大同县| 韶关市| 松江区| 南陵县| 和静县| 馆陶县| 台中市| 吴旗县| 梁河县| 秦安县| 色达县| 株洲市| 临安市| 梨树县| 毕节市| 湖南省| 桓台县| 闽侯县| 库伦旗| 桃江县| 汾阳市| 崇州市| 乐平市| 六安市| 霍城县| 和硕县| 兖州市| 台安县| 晋宁县| 岳阳县| 扎鲁特旗| 玉溪市| 闵行区| 民乐县| 太仓市| 始兴县| 清涧县| 淮安市|