單鏈表的建立與基本操作
阿新 • • 發佈:2018-12-17
連結串列通過“指標”將一組零散的記憶體塊串聯在一起。其中,我們把記憶體塊稱為連結串列的“結點”。為了將所有的結點串起來,每個連結串列的結點除了儲存資料之外,還需要記錄鏈上的下一個結點的地址。如圖所示,我們把這個記錄下個結點地址的指標叫作後繼指標 next。
把第一個結點叫作頭結點,把最後一個結點叫作尾結點。其中,頭結點用來記錄連結串列的基地址。而尾結點特殊的地方是:指標不是指向下一個結點,而是指向一個空地址 NULL,表示這是連結串列上最後一個結點。
#include <iostream> #include <malloc.h> using namespace std; typedef int ElementType; //連結串列節點的定義 typedef struct ListNode { ElementType Element;//資料域,存放資料 ListNode * Next;//指向下一個連結串列節點 }Node,*PNode;
//建立連結串列 PNode CreateList(void) { int len;//用於定義連結串列的長度 int val;//用於存放節點數值 PNode PHead = (PNode)malloc(sizeof(Node));//建立分配一個頭結點記憶體空間 //用於檢測空間是否分配 if(PHead == NULL) { printf("空間分配失敗\n"); exit(-1); } PNode PTail = PHead;//定義連結串列的末尾節點,初始與頭結點一致。 PTail->Next = NULL;//最後一個節點指標置為空 printf("print the num of Node: "); scanf("%d",&len);//輸入節點數 for(int i = 0;i<len;i++) { PNode pNew = (PNode)malloc(sizeof(Node));//分配一個新節點 if(pNew == NULL){ printf("failed"); exit(-1); } printf("the %d Node :",i+1); scanf("%d",&val); pNew->Element = val; PTail->Next = pNew;//末尾節點指標指向下一個新節點 pNew->Next = NULL;//新節點指標指向為空 PTail = pNew;//將新節點複製給末尾節點 } printf("list ok\n"); return PHead;//返回頭節點 }
//連結串列的遍歷操作
void TraverseList(PNode List)
{
PNode P = List->Next;//首節點複製給臨時變數,第一個節點
if(P == NULL)
{
printf("failed");
}
while(P != NULL){
printf("%d ",P->Element);
P = P->Next;
}
printf("\n");
}
//連結串列的查詢操作 PNode FindList(PNode List) { PNode p = List->Next;//首節點複製給臨時變數,第一個節點 int num = 0; // 用於記錄連結串列節點位置 int val = 3; // 用於存放要查詢的值 while(p !=NULL && p->Element != val) { p = p->Next; num++; } if(p !=NULL) { printf("%d\n",num+1);//節點為第一個節點開始 } else { printf("no found\n"); } printf("\n"); return p; }
//在連結串列位置第pos節點前插入包含資料val的節點
void InsertList(PNode List,int pos,int val)
{
int position = 0;
PNode p = List;//定義節點指向"頭結點"
//尋找pos節點的前驅結點
while(p !=NULL && position<pos-1)
{
p = p->Next;
position++;
}
PNode Tmp = (PNode)malloc(sizeof(PNode));//分配一個臨時節點用來儲存要插入的資料
if(Tmp == NULL){
printf("failed\n");
exit(-1);
}
//插入節點
Tmp->Element = val;
Tmp->Next = p->Next;
p->Next = Tmp;
}
//刪除連結串列中的元素
//刪除連結串列中的第pos節點
void DeleteList(PNode List,int pos)
{
int position = 0;
PNode p = List;
while(p != NULL && position<pos-1)
{
p = p->Next;
position++;
}
//刪除節點
PNode Tmp = p->Next;//定義臨時指標Tmp指向要刪除的節點
p->Next = Tmp->Next; //使要刪除節點的前驅結點指向其後驅節點
free(Tmp);//釋放刪除節點的記憶體空間,防止記憶體洩漏
Tmp = NULL;//使q指向空指標,防止產生野指標
}
//刪除整個連結串列操作
void DeleteTheList(PNode List)
{
PNode p,Tmp;
p = List->Next;
List->Next = NULL;
while(P != NULL)
{
Tmp = p->Next;//定義指標P指向連結串列要刪除的連結串列List的第一個點節點
free(p); //釋放指標P指向的節點
p = Tmp;//重新賦值
}
}
//主函式
int main()
{
PNode List = CreateList();
TraverseList(List);
// FindList(List);
InsertList(List,2,0);
TraverseList(List);
DeleteList(List,2);
TraverseList(List);
return 0;
}