今天又學了下鏈表,發上來和菜鳥一起學習,歡迎大神指點···········
今天我實現的是插入鏈表節點和刪除鏈表節點。
看代碼吧,注釋寫的不好的就見諒吧·················
/*
鏈表節點的插入與刪除
編譯環境: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 Insert_Node(pNode , int , int); // 鏈表節點插入函數,第一個參數是頭節點,第二個參數是要在第幾個節點前插入,第三個參數是要插入的數據
int Del_Node(pNode, int ); // 刪除鏈表節點,第一個參數是頭節點,第二個參數是刪除第幾個節點,第三個作為
int main()
{
pNode pHead = NULL; // 定義初始化頭節點,等價於 struct Node *pHead == NULL
int data; // 作為Insert_Node函數的第三個參數
int num; // 作為Inset_Node函數第二個參數
int choose;
int return_val;
pHead = CreateList(); // 創建一個非循環單鏈表,並將該鏈表的頭結點的地址付給pHead
printf( " 你輸入的數據是: ");
TraverseList(pHead); // 調用遍歷鏈表函數
printf( " 是否還要進行如下操作:\n ");
printf( " 1.插入數據 2.刪除數據\n ");
printf( " 請輸入: ");
scanf( " %d ",&choose);
switch (choose)
{
case 1:
{
printf( " 請輸入要在第幾個節點前插入數據: ");
scanf( " %d ",&num);
printf( " 請輸入要插入的數據: ");
scanf( " %d ",&data);
if(Insert_Node(pHead,num,data) == true)
{
printf( " 插入成功\n插入后的數據是:\n ");
TraverseList(pHead);
}
else
{
printf( " 插入失敗\n ");
}
printf( " 操作完成后的數據是: ");
TraverseList(pHead);
break;
}
case 2:
{
printf( " 請輸入要刪除第幾個節點的數據: ");
scanf( " %d ",&num);
return_val = Del_Node(pHead,num);
if (return_val == 0)
{
printf( " 刪除失敗。\n ");
}
else
{
printf( " 刪除成功。刪除的元素是:%d\n ",return_val);
}
printf( " 操作完成后的數據是: ");
TraverseList(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 Insert_Node(pNode pHead, int front, int data)
{
int i = 0;
pNode _node = pHead;
pNode pSwap; // 用於交換
if ((front < 1) && (NULL != _node)) // 判斷用戶輸入的數據是否大於等於1,及_node是否為空
{
return false;
}
while (i < front - 1) // 通過循環使指針指向要插入哪個節點前的節點。說的自己都不懂了,還是看下面的圖吧。
{
_node = _node->pNext;
++i;
}
pNode pNew = (pNode)malloc( sizeof(Node));
pNew->member = data; // 把輸入的數據賦給要插入的節點
pSwap = _node->pNext; // 把下一個節點的地址,給用於交換的pSwap
_node->pNext = pNew; // 把要插入的節點的地址,給上個節點的指針域
pNew->pNext = pSwap; // 把插入節點的下一個節點的地址,給插入節點的指針域
return true;
}
// 刪除鏈表節點函數
// 第一個參數是頭節點,第二個參數是要刪除第幾個節點·······和上面的插入函數是不是很像
int Del_Node(pNode pHead, int back)
{
int i = 0;
int data;
pNode _node = pHead;
pNode pSwap;
if ((back < 1) && (NULL == _node->pNext))
{
printf( " 刪除失敗!\n ");
return 0;
}
while(i < back- 1)
{
_node = _node->pNext;
++i;
}
pSwap = _node->pNext;
data = pSwap->member;
_node->pNext = _node->pNext->pNext;
free(pSwap);
return data;
鏈表節點的插入與刪除
編譯環境: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 Insert_Node(pNode , int , int); // 鏈表節點插入函數,第一個參數是頭節點,第二個參數是要在第幾個節點前插入,第三個參數是要插入的數據
int Del_Node(pNode, int ); // 刪除鏈表節點,第一個參數是頭節點,第二個參數是刪除第幾個節點,第三個作為
int main()
{
pNode pHead = NULL; // 定義初始化頭節點,等價於 struct Node *pHead == NULL
int data; // 作為Insert_Node函數的第三個參數
int num; // 作為Inset_Node函數第二個參數
int choose;
int return_val;
pHead = CreateList(); // 創建一個非循環單鏈表,並將該鏈表的頭結點的地址付給pHead
printf( " 你輸入的數據是: ");
TraverseList(pHead); // 調用遍歷鏈表函數
printf( " 是否還要進行如下操作:\n ");
printf( " 1.插入數據 2.刪除數據\n ");
printf( " 請輸入: ");
scanf( " %d ",&choose);
switch (choose)
{
case 1:
{
printf( " 請輸入要在第幾個節點前插入數據: ");
scanf( " %d ",&num);
printf( " 請輸入要插入的數據: ");
scanf( " %d ",&data);
if(Insert_Node(pHead,num,data) == true)
{
printf( " 插入成功\n插入后的數據是:\n ");
TraverseList(pHead);
}
else
{
printf( " 插入失敗\n ");
}
printf( " 操作完成后的數據是: ");
TraverseList(pHead);
break;
}
case 2:
{
printf( " 請輸入要刪除第幾個節點的數據: ");
scanf( " %d ",&num);
return_val = Del_Node(pHead,num);
if (return_val == 0)
{
printf( " 刪除失敗。\n ");
}
else
{
printf( " 刪除成功。刪除的元素是:%d\n ",return_val);
}
printf( " 操作完成后的數據是: ");
TraverseList(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 Insert_Node(pNode pHead, int front, int data)
{
int i = 0;
pNode _node = pHead;
pNode pSwap; // 用於交換
if ((front < 1) && (NULL != _node)) // 判斷用戶輸入的數據是否大於等於1,及_node是否為空
{
return false;
}
while (i < front - 1) // 通過循環使指針指向要插入哪個節點前的節點。說的自己都不懂了,還是看下面的圖吧。
{
_node = _node->pNext;
++i;
}
pNode pNew = (pNode)malloc( sizeof(Node));
pNew->member = data; // 把輸入的數據賦給要插入的節點
pSwap = _node->pNext; // 把下一個節點的地址,給用於交換的pSwap
_node->pNext = pNew; // 把要插入的節點的地址,給上個節點的指針域
pNew->pNext = pSwap; // 把插入節點的下一個節點的地址,給插入節點的指針域
return true;
}
// 刪除鏈表節點函數
// 第一個參數是頭節點,第二個參數是要刪除第幾個節點·······和上面的插入函數是不是很像
int Del_Node(pNode pHead, int back)
{
int i = 0;
int data;
pNode _node = pHead;
pNode pSwap;
if ((back < 1) && (NULL == _node->pNext))
{
printf( " 刪除失敗!\n ");
return 0;
}
while(i < back- 1)
{
_node = _node->pNext;
++i;
}
pSwap = _node->pNext;
data = pSwap->member;
_node->pNext = _node->pNext->pNext;
free(pSwap);
return data;
}
我自己也畫了兩張圖片,幫助理解,反正我是這么理解的,有錯的歡迎指出
先看下向鏈表中插入節點
下面這個是刪除鏈表節點
歡迎各路神仙指正批評··············
