1. 程式人生 > >C語言資料結構——連結串列

C語言資料結構——連結串列

轉自https://www.cnblogs.com/chenxiaohei/p/6862791.html /* 連結串列節點的插入與刪除

       編譯環境: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;}

在這裡插入圖片描述 在這裡插入圖片描述