链表3

链表3

链表的运算(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);        /*释放链表*/
    }
}

*程序运行结果如下:

  

你可能感兴趣的:(链表3)