<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-144  評論-80  文章-1  trackbacks-0

    鏈表的運算(02)

    發表日期:2003年4月8日????作者:C語言之家搜集整理??已經有2462位讀者讀過此文

    3.鏈表節點的插入
    4.鏈表節點的刪除




    3.鏈表節點的插入
    解:
    ??? 1) 首先聲明一個新節點供輸入要插入節點的內容
    ??? 2) 由用戶輸入一個節點內容(Key),表示欲插入在哪一個節點之后
    ??? 3) 持續往下一個節點,直到節點內容Key或節點指針為NULL為止(即找不到該節點)
    ??? 4) 如果該節點不存在,則插入在節點前
    ????????New->Next=Head
    ????????Head=New
    ??? 5) 如果找到該節點,則
    ??????? New->Next=Pointer->Next
    ??????? Pointer->Next=New
    *程序代碼如下:
    #include<stdlib.h>
    #include<stdio.h>
    #define Max 10
    struct List??????????? /*節點結構聲明*/
    {
    ??? int Number;
    ??? int Total;
    ??? struct List *Next;
    };
    typedef struct List Node;
    typedef Node *Link;
    int Data[2][Max]={1,3,5,7,2,4,6,8,9,0,15,35,10,67,25,65,38,70,30,20};
    /*插入節點至鏈表內*/
    Link Insert_List(Link Head,Link New,int Key)
    {
    ??? Link Pointer;??????? /*聲明節點*/
    ??? Pointer=Head;??????? /*Pointer指針設為首節點*/
    ??? while(1)
    ??? {
    ??????? if(Pointer==NULL)??? /*插入在首節點前*/
    ??????? {
    ??????????? New->Next=Head;
    ??????????? Head=New;
    ??????????? break;
    ??????? }
    ??????? if(Pointer->Number==Key)??? /*插入在鏈表中間或尾端*/
    ??????? {
    ??????????? New->Next=Pointer->Next;
    ??????????? Pointer->Next=New;
    ??????????? break;
    ??????? }
    ??????? Pointer=Pointer->Next;??? /*指向下一個節點*/
    ??? }
    ??? return Head;
    }
    /*輸出鏈表數據*/
    void Print_List(Link Head)
    {
    ??? Link Pointer;??????? /*節點聲明*/
    ??? Pointer=Head;??????? /*Pointer指針設為首節點*/
    ??? while(Pointer!=NULL)????/*當節點為NULL結束循環*/
    ??? {
    ????????printf("[%d,%d]",Pointer->Number,Pointer->Total);
    ????????Pointer=Pointer->Next;????/*指向下一個節點*/
    ??? }
    ??? printf("\n");
    }
    /*釋放鏈表*/
    void Free_List(Link Head)
    {
    ??? Link Pointer;??????? /*節點聲明*/
    ??? while(Head!=NULL)??? /*當節點為NULL結束循環*/
    ??? {
    ??????? Pointer=Head;
    ??????? Head=Head->Next;
    ??????? free(Pointer);
    ??? }
    }
    /*建立鏈表*/
    Link Create_List(Link Head)
    {
    ??? Link New;??????? /*節點聲明*/
    ??? Link Pointer;??? /*節點聲明*/
    ??? int i;
    ??? Head=(Link)malloc(sizeof(Node));??? /*分配內存*/
    ??? if(Head==NULL)
    ??????? printf("Memory allocate Failure!\n");??? /*內存分配失敗*/
    ??? else
    ??? {
    ??????? Head->Number=Data[0][0];??????? /*定義首節點數據編號*/
    ??????? Head->Total=Data[1][0];
    ??????? Head->Next=NULL;
    ??????? Pointer=Head;??????? /*Pointer指針設為首節點*/
    ??????? for(i=1;i<Max;i++)
    ??????? {
    ??????????? New=(Link)malloc(sizeof(Node));??? /*分配內存*/
    ??????????? New->Number=Data[0][i];
    ??????????? New->Total=Data[1][i];
    ??????????? New->Next=NULL;
    ??????????? Pointer->Next=New;??????? /*將新節點串連在原列表尾端*/
    ??????????? Pointer=New;??????????? /*列表尾端節點為新節點*/
    ??????? }
    ??? }
    ??? return Head;
    }
    /*主程序*/
    void main()
    {
    ??? Link Head;??????? /*節點聲明*/
    ??? Link New;
    ??? int Key;
    ??? Head=Create_List(Head);??? /*建立鏈表*/
    ??? if(Head!=NULL)
    ??? {
    ??????? Print_List(Head);????
    ??????? while(1)
    ??????? {
    ??????????? printf("Input 0 to Exit\n");??? /*數據輸入提示*/
    ??????????? New=(Link)malloc(sizeof(Node));??? /*分配內存*/
    ??????????? printf("Please input Data number:");
    ??????????? scanf("%d",&New->Number);
    ??????????? if(New->Number==0)??????? /*輸入0時結束循環*/
    ??????????????? break;
    ??????????? printf("Please input the data total:");
    ??????????? scanf("%d",&New->Total);
    ??????????? printf("Please input the data number for Insert:");
    ??????????? scanf("%d",&Key);
    ??????????? Head=Insert_List(Head,New,Key);??? /*插入節點*/
    ??????????? Print_List(Head);??????????????? /*輸出鏈表數據*/
    ??????? }
    ??????? Free_List(Head);??????? /*釋放鏈表*/
    ??? }
    }
    *程序運行結果如下:

    ------------------------------------------------------------------

    4.鏈表節點的刪除
    解:
    ??? 持續往下一個節點查找要刪除的節點,直到節點內容找到或節點指針為NULL(即找不到該節點)。
    ??? 在刪除時,必須記錄前一個節點的位置(Back)
    ??? 如果該節點不存在,輸出一個節點不存在的提示
    ??? 如果該節點存在,且是首節點:
    ??????? Head=Pointer->Next
    ??????? free(Pointer)
    ??? 如果該節點存在,但不是首節點(即鏈表內節點或尾端節點),則:
    ??????? Back->Next=Pointer->Next
    ??????? free(Pointer)
    *程序代碼如下:
    #include<stdio.h>
    #include<stdlib.h>
    #define Max 10
    struct List????????????/*節點結構聲明 */
    {
    ????int Number;
    ????int Total;
    ????struct List *Next;
    };
    typedef struct List Node;
    typedef Node *Link;
    int Data[2][Max]={1,3,5,7,2,4,6,8,9,10,15,35,10,67,25,65,38,70,30,20};
    /*刪除鏈表內節點*/
    Link Delete_List(Link Head,int Key)
    {
    ????Link Pointer;????????/*節點聲明*/
    ????Link Back;
    ????Pointer=Head;????????/*Pointer 指針設為首節點*/
    ????while(1)
    ????{
    ????????if(Pointer->Next==NULL)
    ????????{
    ????????????printf("Not Found!\n");
    ????????????break;
    ????????}
    ????????if(Head->Number==Key)????????/*刪除首節點*/
    ????????{
    ????????????Head=Pointer->Next;
    ????????????free(Pointer);
    ????????????break;
    ????????}
    ????????Back=Pointer;
    ????????Pointer=Pointer->Next;????/*指向下一個節點*/
    ????????if(Pointer->Number==Key)????/*插入在鏈表中間或尾端*/
    ????????{
    ????????????Back->Next=Pointer->Next;
    ????????????free(Pointer);
    ????????????break;
    ????????}
    ????}
    ????return Head;
    }
    /*輸出鏈表數據*/
    void Print_List(Link Head)
    {
    ????Link Pointer;????????/*節點聲明*/
    ????Pointer=Head;????????/*Pointer指針設為首節點*/
    ????while(Pointer!=NULL)????/*當節點為NULL結束循環*/
    ????{
    ????????printf("[%d,%d]",Pointer->Number,Pointer->Total);
    ????????Pointer=Pointer->Next;????/*指向下一個節點*/
    ????}
    ????printf("\n");
    }
    /*釋放鏈表*/
    void Free_List(Link Head)
    {
    ????Link Pointer;????????/*節點聲明*/
    ????while(Head!=NULL)????/*當節點為NULL結束循環*/
    ????{
    ????????Pointer=Head;
    ????????Head=Head->Next;????????/*指向下一個節點*/
    ????????free(Pointer);
    ????}
    }
    /*建立鏈表*/
    Link Create_List(Link Head)
    {
    ????Link New;????????/*節點聲明*/
    ????Link Pointer;
    ????int i;
    ????Head=(Link)malloc(sizeof(Node));????????/*分本內存*/
    ????if(Head==NULL)
    ????????printf("Memory allocate Failure!\n");????/*內存分配失敗*/
    ????else
    ????{
    ????????Head->Number=Data[0][0];????????/*定義首節點數據編號*/
    ????????Head->Total=Data[1][0];
    ????????Head->Next=NULL;
    ????????Pointer=Head;????????/*Pointer指針設為首節點*/
    ????????for(i=1;i<Max;i++)
    ????????{
    ????????????New=(Link)malloc(sizeof(Node));????????/*分配內存*/
    ????????????New->Number=Data[0][i];
    ????????????New->Total=Data[1][i];
    ????????????New->Next=NULL;
    ????????????Pointer->Next=New;????????/*將新節點串連在原列表尾端*/
    ????????????Pointer=New;????????????/*列表尾端節點為新節點*/
    ????????}
    ????}
    ????return Head;
    }
    /*主程序*/
    void main()
    {
    ????Link Head=NULL;????????/*節點聲明*/
    ????int Key;
    ????Head=Create_List(Head);????????/*建立鏈表*/
    ????if(Head!=NULL)
    ????{
    ????????Print_List(Head);
    ????????while(1)
    ????????{
    ????????????printf("Input 0 to exit\n");????/*數據輸入提示*/
    ????????????printf("Please input the data number for Delete:");
    ????????????scanf("%d",&Key);
    ????????????if(Key==0)????????/*時結束循環*/
    ????????????????break;
    ????????????Head=Delete_List(Head,Key);????/*刪除節點*/
    ????????????Print_List(Head);????????????? /*輸出鏈表*/
    ????????}
    ??????? Free_List(Head);????????/*釋放鏈表*/
    ????}
    }

    *程序運行結果如下:

    ??
    posted on 2006-07-17 22:56 小力力力 閱讀(2377) 評論(0)  編輯  收藏 所屬分類: C/C++
    主站蜘蛛池模板: 亚洲人成影院在线高清| 黄页网站免费观看| 久久亚洲国产成人影院| 亚洲欧洲精品无码AV| 又黄又大又爽免费视频| 午夜性色一区二区三区免费不卡视频| 成人无码区免费A∨直播| 精品久久久久亚洲| 亚洲中文字幕无码久久2020 | 亚洲国产综合91精品麻豆| 亚洲成A人片在线观看中文| 成人免费无码大片a毛片| 18女人腿打开无遮掩免费| A片在线免费观看| 国产V片在线播放免费无码| 日韩欧美亚洲中文乱码| 伊人久久五月丁香综合中文亚洲| 久久亚洲精品无码VA大香大香| 亚洲精品美女久久777777| 亚洲精品无码99在线观看 | 亚洲国产乱码最新视频| 亚洲成人免费电影| 亚洲网站在线免费观看| 亚洲avav天堂av在线不卡| 亚洲精品国产字幕久久不卡| 中文字幕亚洲综合久久菠萝蜜 | 亚洲成A人片在线播放器| 亚洲日本在线免费观看| 噜噜噜亚洲色成人网站∨| 香蕉视频在线观看亚洲| 国产V亚洲V天堂无码| 亚洲乱码无码永久不卡在线| AV在线亚洲男人的天堂| 2048亚洲精品国产| 国产亚洲成AV人片在线观黄桃| 亚洲精品午夜无码专区| 亚洲成A人片777777| 亚洲人成网站影音先锋播放| 久久综合亚洲鲁鲁五月天| 亚洲一区二区三区免费在线观看| 亚洲最大的视频网站|