线性表(二)——单链表(3)——单链表应用举例(3)—— 增序排列节点

/*       
*Copyright (c) 2015 , 烟台大学计算机学院       
*All right resvered .       
*文件名称: 单链表的应用举例.cpp       
*作    者: 郑兆涵       
*线性表(二)——单链表 (3) 
*/ 


问题:增序排列节点


编程代码:

//头文件:linklist.h,包含定义顺序表数据结构的代码、宏定义、要实现算法的函数的声明    
#ifndef LINKLIST_H_INCLUDED    
#define LINKLIST_H_INCLUDED    
typedef int ElemType;    
typedef struct LNode        //定义单链表结点类型    
{    
    ElemType data;    
    struct LNode *next;     //指向后继结点    
}LinkList;    
void CreateListF(LinkList *&L,ElemType a[],int n);//头插法建立单链表    
void CreateListR(LinkList *&L,ElemType a[],int n);//尾插法建立单链表    
void InitList(LinkList *&L);  //初始化线性表    
void DestroyList(LinkList *&L);  //销毁线性表    
bool ListEmpty(LinkList *L);  //判断线性表是否为空    
int ListLength(LinkList *L);  //求线性表长度    
void DispList(LinkList *L);  //输出线性表    
bool GetElem(LinkList *L,int i,ElemType &e);  //求线性表某个数据元素值    
int LocateElem(LinkList *L,ElemType e);  //按元素值查找    
bool ListInsert(LinkList *&L,int i,ElemType e);  //插入数据元素    
bool ListDelete(LinkList *&L,int i,ElemType &e);  //删除数据元素    
#endif // LINKLIST_H_INCLUDED    

//源文件:linklist.cpp,包含实现各种算法的函数的定义    
#include <stdio.h>    
#include <malloc.h>    
#include "linklist.h"    
void CreateListF(LinkList *&L,ElemType a[],int n)//头插法建立单链表    
{    
    LinkList *s;    
    int i;    
    L=(LinkList *)malloc(sizeof(LinkList));     //创建头结点    
    L->next=NULL;    
    for (i=0; i<n; i++)    
    {    
        s=(LinkList *)malloc(sizeof(LinkList));//创建新结点    
        s->data=a[i];    
        s->next=L->next;            //将*s插在原开始结点之前,头结点之后    
        L->next=s;    
    }    
}    
void CreateListR(LinkList *&L,ElemType a[],int n)//尾插法建立单链表    
{    
    LinkList *s,*r;    
    int i;    
    L=(LinkList *)malloc(sizeof(LinkList));     //创建头结点    
    L->next=NULL;    
    r=L;                    //r始终指向终端结点,开始时指向头结点    
    for (i=0; i<n; i++)    
    {    
        s=(LinkList *)malloc(sizeof(LinkList));//创建新结点    
        s->data=a[i];    
        r->next=s;          //将*s插入*r之后    
        r=s;    
    }    
    r->next=NULL;           //终端结点next域置为NULL    
}    
void InitList(LinkList *&L)    
{    
    L=(LinkList *)malloc(sizeof(LinkList));     //创建头结点    
    L->next=NULL;    
}    
void DestroyList(LinkList *&L)    
{    
    LinkList *p=L,*q=p->next;    
    while (q!=NULL)    
    {    
        free(p);    
        p=q;    
        q=p->next;    
    }    
    free(p);    //此时q为NULL,p指向尾结点,释放它    
}    
bool ListEmpty(LinkList *L)    
{    
    return(L->next==NULL);    
}    
int ListLength(LinkList *L)    
{    
    LinkList *p=L;    
    int i=0;    
    while (p->next!=NULL)    
    {    
        i++;    
        p=p->next;    
    }    
    return(i);    
}    
void DispList(LinkList *L)    
{    
    LinkList *p=L->next;    
    while (p!=NULL)    
    {    
        printf("%d ",p->data);    
        p=p->next;    
    }    
    printf("\n");    
}    
bool GetElem(LinkList *L,int i,ElemType &e)    
{    
    int j=0;    
    LinkList *p=L;    
    while (j<i && p!=NULL)    
    {    
        j++;    
        p=p->next;    
    }    
    if (p==NULL)            //不存在第i个数据结点    
        return false;    
    else                    //存在第i个数据结点    
    {    
        e=p->data;    
        return true;    
    }    
}    
int LocateElem(LinkList *L,ElemType e)    
{    
    LinkList *p=L->next;    
    int n=1;    
    while (p!=NULL && p->data!=e)    
    {    
        p=p->next;    
        n++;    
    }    
    if (p==NULL)    
        return(0);    
    else    
        return(n);    
}    
bool ListInsert(LinkList *&L,int i,ElemType e)    
{    
    int j=0;    
    LinkList *p=L,*s;    
    while (j<i-1 && p!=NULL) //查找第i-1个结点    
    {    
        j++;    
        p=p->next;    
    }    
    if (p==NULL)    //未找到位序为i-1的结点    
        return false;    
    else            //找到位序为i-1的结点*p    
    {    
        s=(LinkList *)malloc(sizeof(LinkList));//创建新结点*s    
        s->data=e;    
        s->next=p->next;                        //将*s插入到*p之后    
        p->next=s;    
        return true;    
    }    
}    
bool ListDelete(LinkList *&L,int i,ElemType &e)    
{    
    int j=0;    
    LinkList *p=L,*q;    
    while (j<i-1 && p!=NULL)    //查找第i-1个结点    
    {    
        j++;    
        p=p->next;    
    }    
    if (p==NULL)                //未找到位序为i-1的结点    
        return false;    
    else                        //找到位序为i-1的结点*p    
    {    
        q=p->next;              //q指向要删除的结点    
        if (q==NULL)    
            return false;           //若不存在第i个结点,返回false    
        e=q->data;    
        p->next=q->next;        //从单链表中删除*q结点    
        free(q);                //释放*q结点    
        return true;    
    }    
}   

#include <stdio.h>
#include <malloc.h>
#include "linklist.h"
void sort(LinkList *&L)
{
    LinkList *p,*pre,*q;
    p=L->next->next;        //p指向L的第2个数据节点
    L->next->next=NULL;     //构造只含一个数据节点的有序表
    while (p!=NULL)
    {
        q=p->next;          //q保存*p节点后继节点的指针
        pre=L;              //从有序表开头进行比较,pre指向插入*p的前驱节点
        while (pre->next!=NULL && pre->next->data<p->data)
            pre=pre->next;  //在有序表中找插入*p的前驱节点*pre
        p->next=pre->next;  //将*pre之后插入*p
        pre->next=p;
        p=q;                //扫描原单链表余下的节点
    }
}
int main()
{
    LinkList *L;
    int i;
    ElemType a[]= {1,3,2,9,0,4,7,6,5,8};
    InitList(L);
    for(i=9; i>=0; i--)
        ListInsert(L, 1, a[i]);
    printf("L:");
    DispList(L);
    printf("排序\n");
    sort(L);
    printf("L:");
    DispList(L);
    DestroyList(L);
    return 0;
}

输出结果:

线性表(二)——单链表(3)——单链表应用举例(3)—— 增序排列节点_第1张图片




你可能感兴趣的:(线性表(二)——单链表(3)——单链表应用举例(3)—— 增序排列节点)