C語言鏈表的創建、插入和刪除

/* 
            鏈表節點的插入與刪除 
 
       編譯環境: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;}    

先看下向鏈表中插入節點node

 

 

下面這個是刪除鏈表節點windows

相關文章
相關標籤/搜索