c語言單鏈表的基本操作
連結串列
是一種動態儲存方式,和順序表相比,連結串列物理儲存上是非連續的,而且採用動態記憶體開闢,其優點是方便插入,沒有上限的儲存,不需要記憶體空間的重組,能有效的分配和利用記憶體資源,不會造成空間浪費,缺點是排序很麻煩,查詢也很麻煩,而且需要多個指標操作,容易出錯。
連結串列的各類操作包括:連結串列的建立、刪除、插入、輸出、排序等。
結構體定義
要想學懂連結串列,必須先學好並靈活運用結構,在連結串列中,一個個獨立的結點就是一個結構體元素,一個結點包括兩部分(資料域和指標域),靠指標將他們連結在一起。
typedf struct Node
{
DataType _date;
struct Node *_next;
//存放下一個節點的地址
}Node,*pNode;
連結串列
建立連結串列三個重要屬性:頭指標、頭結點、尾結點。
頭指標(pHead):指向連結串列頭部的指標,也可以看作是 一個特殊的結點,有指標域和資料域,雖然有資料域但不儲存任何資料,也沒有任何作用,指標域指向第一個結點資料域;
頭結點(pNode):連結串列的第一個結構體元素,其指標域存放第2個節點的地址;
尾結點(TailNode):連結串列最後一個結構體元素,資料域存放資料域,指標域一般指向空(NULL)。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<assert.h>
#include<malloc.h>
#include<stdio.h>
#include<Windows.h>
typedef int DataType;
typedef struct Node
{
DataType _data;
struct Node * _pNext;
}*pNode;
//初始化連結串列
void InitList(pNode* pHead)
{
assert(pHead);
*pHead = NULL;
}
//建立一個新連結串列節點
pNode BuyNode(DataType data)
{
pNode pNewNode = (pNode)malloc(sizeof(struct Node));
if(NULL == pNewNode)
{
assert(0);
return NULL;
}
pNewNode->_data = data;
pNewNode->_pNext = NULL;
return pNewNode;
}
//尾插
void PushBack(pNode* pHead,DataType _data)
{
assert(pHead);
if(NULL == *pHead)
{
*pHead = BuyNode(_data);
}
else {
pNode pTailNode = *pHead;
while(pTailNode->_pNext)
{
pTailNode = pTailNode->_pNext;
}
pTailNode->_pNext = BuyNode(_data);
}
}
//尾刪
void PopBack(pNode* pHead) {
if(NULL == *pHead)
return;
else if(NULL == (*pHead)->_pNext)
{
free(*pHead);
*pHead = NULL;
}
else
{
pNode pTailNode = *pHead;
pNode pPre = NULL;
while(pTailNode->_pNext)
{
pPre = pTailNode;
pTailNode = pTailNode->_pNext;
}
pPre->_pNext = NULL;
free(pTailNode);
}
}
//列印連結串列
void PrintList(pNode pHead)
{
pNode pCur = pHead;
while(pCur)
{
printf("%d--->",pCur->_data);
pCur = pCur->_pNext;
}
printf("NULL\n");
} //頭插
void PoshFront(pNode* pHead,DataType data)
{
pNode pNewNode;
assert(pHead);
pNewNode = BuyNode(data);
if(NULL == pNewNode)
return;
pNewNode->_pNext = *pHead;
*pHead = pNewNode;
}
//頭刪
void PopFront(pNode* pHead)
{
pNode pCur = *pHead;
assert(pHead);
if(NULL == pCur)
return;
else
{
*pHead = (*pHead)->_pNext;
free(pCur);
}
}
// 返回結點在連結串列中的位置
pNode FindList(pNode pHead,DataType data)
{
pNode pCur = pHead;
while(pCur)
{ if(pCur->_data == data)
return pCur;
else
pCur = pCur->_pNext;
}
return NULL;
}
// 任意位置插入值為data的結點
pNode Insert(pNode pos,DataType data)
{
pNode pNewNode;
if(NULL == pos)
return NULL;
pNewNode = BuyNode(data);
if(NULL == pNewNode)
//return NULL;
pNewNode->_pNext = pos->_pNext;
pos->_pNext = pNewNode;
}
// 刪除pos位置上的結點
void Erase(pNode* pHead,pNode pos)
{
assert(pHead);
if(NULL == *pHead || NULL == pos)
return;
if(*pHead == pos)
PopFront(pHead);
else
{ pNode pCur = *pHead;
while(pCur)
{
if(pCur->_pNext == pos)
break;
pCur = pCur->_pNext;
}
pCur->_pNext = pos->_pNext;
free(pos);
}
}
// 銷燬單鏈表
void DestoryList(pNode* pHead)
{
//正向銷燬
pNode pCur = *pHead;
pNode pNext = NULL;
while(pCur)
{
pNext = pCur->_pNext;
free(pCur);
pCur = pNext;
} *pHead = NULL; }
// 求連結串列中節點的個數
int SizeList(pNode pHead)
{ int count = 1; pNode pCur = pHead;
while(pCur)
{
count++;
pCur = pCur->_pNext;
}
return count;
}
相關推薦
c++實現單鏈表基本操作
程式媛決定好好學習寫程式碼 連結串列是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中的指標連結次序實現的。連結串列由一系列結點(連結串列中每一個元素稱為結點)組成,結點可以在執行時動態生成。每個結點包括兩個部分:一個是儲存資料元素的資料域,
C語言單鏈表的基本操作總結
刷LeedCode時使用單鏈表頻出錯誤,於是花時間總結了一下單鏈表的基本操作,把所寫程式碼和詳細註釋貼在這裡,以備後用。 #include <stdio.h> #include <stdlib.h> /*定義結構體連結串列節點: 該結構體有兩個屬性,一個是int型
C語言單鏈表及基本操作的實現
資料結構中,單向連結串列(又名單鏈表、線性連結串列)是連結串列的一種,其特點是連結串列的連結方向是單向的,對連結串列的訪問要通過從頭部開始,依序往下讀取。 下面的程式碼是使用指標實現的
c語言單鏈表的基本操作(程式碼)
c語言實現單鏈表的基本操作:建立、列印、刪除、插入、逆序。僅供學習之用還需不斷完善,有待讀者自己研究 #include <stdio.h> #include <stdlib.h> typedef struct stu { int data; /
c語言單鏈表的基本操作
連結串列 是一種動態儲存方式,和順序表相比,連結串列物理儲存上是非連續的,而且採用動態記憶體開闢,其優點是方便插入,沒有上限的儲存,不需要記憶體空間的重組,能有效的分配和利用記憶體資源,不會造成空間浪費,缺點是排序很麻煩,查詢也很麻煩,而且需要多個指標操作,容
單鏈表基本操作的C語言實現(鏈式儲存結構)
#include<stdio.h> #include<stdlib.h> typedef int DataType; typedef struct Node{ DataType data; struct Node *next; }
資料結構(c語言)——線性單鏈表基本操作
#include <stdio.h> #include <stdlib.h> typedef int Element; typedef char(*Status)[10]; #define ERROR "error" #define OK "ok"
《資料結構與演算法》-單鏈表基本操作的C語言實現
最近在學演算法內容,發現很多演算法依賴於基本的資料結構,所以從新溫習資料結構,記錄一下,以後知識點忘記可以提醒自己哪裡比較容易出錯。 所用教材《資料結構與演算法分析》by Mark Allen Weiss 《資料結構》(C語言
C語言-單鏈表的基本操作-嚴蔚敏版的資料結構
以下部分是標頭檔案 #ifndef __LianBiao__ #define __LianBiao__ typedef int ElemType; typedef struct LNode { int data; struct LNode
第一篇部落格—c語言單鏈表的基本操作
c語言單鏈表的基本操作 對於c語言的初學者來說,連結串列是一塊大難點,其中用到結構體,指標的知識,這裡講的是最簡單的單鏈表,連結串列是一種動態儲存方式,和陣列相比,連結串列的優點是方便插入,沒有上限的儲存(相對來說),缺點也很明顯,排序很煩,查詢也很麻煩。
C 資料結構中單鏈表基本操作
C中的typedef C中的typedef關鍵字作用是為一種資料型別定義一個新名字,這樣做的目的有兩個,一是給變數定義一個易記且意義明確的新名字,如: typedef unsigned char BYTE; 把unsigned char型別自命名為BYTE。另一個目的是
c++學習筆記—單鏈表基本操作的實現
用c++語言實現的單鏈表基本操作,包括單鏈表的建立(包括頭插法和尾插法建表)、結點的查詢、刪除、排序、列印輸出、逆置、連結串列銷燬等基本操作。 IDE:vs2013 具體實現程式碼如下: #include "stdafx.h" #include <malloc.h
C++ 單鏈表基本操作分析與實現 連結串列 連結串列是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中的指標連結次序實現的。連結串列由一系列結點(連結串列中每一個元素稱為結點)組成,結
連結串列 連結串列是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中的指標連結次序實現的。連結串列由一系列結點(連結串列中每一個元素稱為結點)組成,結點可以在執行時動態生成。每個結點包括兩個部分:一個是儲存資料元素的資料域,另一個是儲存下一個結點地址的指標域。 相比於線性表
c語言-單鏈表(一)
printf blog 定義 單鏈表 mage 操作 img 生成 return 定義節點: typedef struct Node { int data; Node* pNext; }NODE, *PNODE; 細節說明,PNode 就代表str
C語言——單鏈表——學生管理系統
鞏固了一下單鏈表的知識點,並運用單鏈表寫了個簡單的學生管理系統 實現功能:增、刪、改、查 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #includ
單鏈表 基本操作(元素遞增排序)
題目描述: 有一個帶頭節點的單鏈表L(至少有一個數據節點),設計一個演算法使其元素遞增有序排列。 解題思路: 由於單鏈表L中有一個以上的資料節點,首先構造一個只含有頭結點和首節點的有序單鏈表(只含有一個數據節點的單鏈表一定是有序的),然後掃描單鏈表L餘下的節點(由P指向),在有序單鏈表中
單鏈表基本操作(刪除連結串列中最大元素)
題目描述: 設計一個演算法,刪除一個單鏈表L中元素值最大的節點(假設這樣的節點唯一) 解題思路: 在單鏈表中刪除一個節點先要找到它的前驅節點,用指標p掃描整個單鏈表,pre指向節點p的前驅節點,在掃描時用maxp指向data域值最大的節點,maxpre指向maxp所指節點的前驅節點,當連
單鏈表 簡單題(單鏈表基本操作)
題目描述: 有一個帶頭結點的單鏈表L=(a1,b1,a2,b2,......an,bn),設計一個演算法將其拆分成兩個帶頭結點的單鏈表L1和L2,其中L1=(a1,a2,a3...an),L2=(b1,b2,b3....bn),要求L1使用L的頭結點。 解題思路: 利用原單鏈表L中的所有
C語言單鏈表
學過線性表中的順序表的都知道,順序表裡的資料在實體記憶體上是相鄰的,所以當我們在順序表中想要訪問下一個元素時可以直接去訪問,就像陣列一樣。但是單鏈表卻不同,單鏈表的資料儲存的位置是動態分配的,也就是說單鏈表的儲存在實體記憶體上不是相鄰的,所以我們就只能通過指標這種方式來把單鏈表串起來,
C語言 線性表的操作~(未完)
#include <stdio.h> #include <malloc.h> typedef struct{ int *elem; //基地址 int length; int listsize; }Seqlist;//定義Seq這個新的資料