论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > C语言程序设计教程
Tag:新手,函数,指针,数据类型,对象,Turbo,入门,运算符,数组,结构,二级,,tc,游戏,试题,问答,编译,视频教程

链表的运算(03)

文章类别:C语言程序设计 | 发表日期:2008-9-24 14:45:42

5.反转链表
6.链接两个链表   


5.反转链表
解:
    1) 从首节点开始为节点、下一个节点的下一个节点为Pointer节点,若Back节点是首节点,则将节点的指针设为NULL。下一个节点设为Pointer节点的指针,将Pointer节点的指针指向上一个节点,Back节点设为Pointer节点,Pointer 节点设为下一个节点。
        Back=Head
        Pointer=Back->Next
        Pointer->Next=Back
        Back=Pointer
        Pointer=Next
    2) 下一个节点设为Pointer节点指针,将Pointer节点的指针向上一个节点,下一个节点设为Pointer节点,Pointer节点设为下一个节点。
        Next=Pointer->Next
        Pointer->Next=Back
        Back=Pointer
        Pointer=Next
        重复步聚2),直到Pointer节点的指针为NULL为止。
    3)将Pointer节点的指针指向上一个节点,首节点Head节点设为Pointer节点。
        Pointer->Next=Back
        Head=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 Invert_List(Link Head)
{
    Link Pointer;        /*节点声明*/
    Link Back;            /*上一个节点*/
    Link Next;            /*下一个节点*/
    Back=Head;            /*Back指针设为首节点*/
    Pointer=Back->Next;
    Back->Next=NULL;
    Next=Pointer->Next;
    Pointer->Next=Back;
    Back=Pointer;
    Pointer=Next;
    while(Pointer->Next!=NULL)    /*当到达链表尾端时结束循环*/
    {
        Next=Pointer->Next;
        Pointer->Next=Back;
        Back=Pointer;
        Pointer=Next;
    }
    Pointer->Next=Back;
    Head=Pointer;
    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;        /*节点声明*/
    Head=Create_List(Head);        /*建立链表*/
    if(Head!=NULL)
    {
        printf("Input Data:\n");
        Print_List(Head);        /*输出链表*/
        Head=Invert_List(Head);    /*反转链表*/
        printf("After Invert:\n");
        Print_List(Head);         /*输出链表*/
        Free_List(Head);          /*释放链表*/
    }
}
*运行结果

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

6.链接两个链表   
解:
    两个链表的链接是将第2个链表的首节点串接在第1个链表的尾端。找到第1个链表的尾端,将该节点指针指向第2个节点的首节点。
*程序代码如下:
#include<stdlib.h>
#include<stdio.h>
#define Max1 10
#define Max2 6
struct List        /*节点结构声明*/
{
    int Number;
    struct List *Next;
};
typedef struct List Node;
typedef Node *Link;
int Data1[Max1]={1,2,3,4,5,6,7,8,9,10};
int Data2[Max2]={11,12,13,14,15,16};
/*链接链表*/
Link Concatenate_List(Link Head1,Link Head2)
{
    Link Pointer;        /*节点声明*/
    Link Next=NULL;        /*下一个节点*/
    Pointer=Head1;    /*Pointer指针设为首节点*/
    while(Pointer->Next!=NULL)    /*当达链表尾端时结束循环*/
        Pointer=Pointer->Next;
    Pointer->Next=Head2;
    return Head1;
}
/*输出链表数据*/
void Print_List(Link Head)
{
    Link Pointer;        /*节点声明*/
    Pointer=Head;        /*Pointer指针设为首节点*/
    while(Pointer!=NULL)    /*当节点为NULL结束循环*/
    {
        printf("[%d]",Pointer->Number);
        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,int *Data,int Max)
{
    Link New;        /*节点声明*/
    Link Pointer;
    int i;
    Head=(Link)malloc(sizeof(Node));    /*分配内存*/
    if(Head==NULL)
        printf("Memory allocate Failure!\n");    /*内存分配失败*/
    else
    {
        Head->Number=Data[0];    /*定义首节点数据编号*/
        Head->Next=NULL;
        Pointer=Head;            /*Pointer指针设为首节点*/
        for(i=1;i<Max;i++)
        {
            New=(Link)malloc(sizeof(Node));    /*分配内存*/
            New->Number=Data[i];
            New->Next=NULL;
            Pointer->Next=New;        /*将新节点串连在原列表尾端*/
            Pointer=New;              /*列表尾端节点为新节点*/
        }
    }
    return Head;
}
/*主程序*/
void main()
{
    Link Head=NULL;        /*节点声明*/
    Link Head1=NULL;
    Link Head2=NULL;   
    Head1=Create_List(Head1,Data1,Max1);        /*建立链表1*/        
    Head2=Create_List(Head2,Data2,Max2);        /*建立链表2*/
    if(Head1!=NULL&&Head2!=NULL)
    {
        printf("Input Data:\n");
        Print_List(Head1);        /*输出链表1*/
        Print_List(Head2);        /*输出链表2*/
        Head=Concatenate_List(Head1,Head2);    /*链接链表*/
        printf("After Concatenate:\n");
        Print_List(Head);        /*输出链接后的链表*/
        Free_List(Head);        /*释放链表*/
    }
}
*运行结果如下:

上一篇:{应用}链表的运算(02) 人气:5712
下一篇:{应用}马踏棋盘问题 人气:6421
视频教程列表
文章教程搜索
 
C语言程序设计推荐教程
C语言程序设计热门教程