<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++
    主站蜘蛛池模板: 亚欧乱色国产精品免费视频| 亚洲不卡在线观看| 国产精品亚洲二区在线| 亚洲欧洲免费无码| 亚洲天堂2016| 成人毛片18女人毛片免费| 亚洲免费视频网址| 西西大胆无码视频免费| 国产亚洲精品成人AA片| 国产又粗又长又硬免费视频| 亚洲AV电影天堂男人的天堂| 又粗又大又长又爽免费视频| 一级做a爱过程免费视| 国产亚洲精品国看不卡| 久久免费精彩视频| 亚洲一区二区三区在线观看蜜桃| 一个人免费观看在线视频www| 亚洲国产欧美国产综合一区| 又粗又黄又猛又爽大片免费 | 可以免费观看的毛片| 亚洲VA成无码人在线观看天堂| 日韩电影免费在线观看中文字幕| 亚洲电影免费观看| 最近2019中文字幕免费看最新| 最新亚洲人成网站在线观看 | 亚洲一区二区三区免费| 亚洲午夜久久久久久噜噜噜| 18级成人毛片免费观看| 亚洲avav天堂av在线网毛片| 亚洲日本一区二区三区在线不卡| 免费毛片a线观看| 亚洲无吗在线视频| 亚洲精品和日本精品| 97视频免费观看2区| 亚洲av日韩av永久无码电影| a级亚洲片精品久久久久久久 | 成人毛片18女人毛片免费96| 大妹子影视剧在线观看全集免费| 久久精品国产亚洲αv忘忧草| 亚洲AV中文无码乱人伦| 99爱免费观看视频在线|