重学数据结构之算法2.1

来源:互联网 发布:织梦cms 视频播放 编辑:程序博客网 时间:2024/05/22 05:13

       一年前学习的数据结构已经基本上还给老师了,现在距离找工作还有几个月时间,正好重新学习一个数据结构。这次使用的教材是严蔚敏的《数据结构》c语言版。希望能在毕业前重新学完一遍。。。

#include<stdio.h>  //输入输出函数头文件#include<stdlib.h>  //内存申请函数头文件#define LIST_INIT_SIZE  10#define LISTINCREMENT  10typedef int ElemType ;typedef struct{    ElemType* elem ;                   //存储空间基址    int length ;                       //当前长度    int listsize ;                     //当前分配的存储容量(以sizeof(ElemType)为单位)}Sqlist ;//操作结构,构造一个空的线性表Lvoid InitList( Sqlist& L ){    //首先申请一定的空间    L.elem = ( ElemType* ) malloc( LIST_INIT_SIZE * sizeof ( ElemType ) ) ;    //判断是否申请成功    if ( ! L.elem )    {        printf( "分配内存失败:\n " );        exit ( -1 ) ;    }            //将此时线性表的大小初始化为0    L.length = 0 ;    //将此线性表的剩余空间置为最大    L.listsize =  LIST_INIT_SIZE ;}//初始条件:线性表L已经存在//操作结果,销毁线性表L//初始条件:线性表L已经存在//操作结果:将L重置为空表void ClearList ( Sqlist& L){    free ( L.elem ) ;    InitList(L) ;}//初始条件:线性表L以存在//操作结果:若L为空表,则返回TRUE,否则返回FALSEint ListEmpty ( Sqlist L ){    if ( L.length == 0 )        return 0 ;    else        return 1 ;}//初始条件:线性表L已经存在//返回L中数据元素的个数int ListLength ( Sqlist L ){    return L.length ;}//初始条件:线性表已存在,1<=i<=ListLength(L)//操作结果:用e返回L中第i个数据元素的值void GetElem( Sqlist L , int i , ElemType& e ){    e = *( L.elem +i ) ;}int compare(ElemType x , ElemType y){    if ( x == y )        return 1 ;    else        return 0 ;}//初始条件:线性表L已存在,compare()是数据元素判定函数//操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。若这样的数据元素不存在,则返回值为0int LocateElem ( Sqlist L , ElemType e ){    int i = 1 ;    while( (!compare ( L.elem [ i ] , e )) && i < L.length )    {        i++ ;    }    if ( i == L.length )        return 0 ;    else        return i ;}//初始条件:线性表L已存在,1<=i<=ListLength(L)+1//操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1void ListInsert( Sqlist& L , int i , ElemType e ){    if ( i < 1 || i > L.length )    {        printf( "插入位置不在数组范围之内:\n ") ;        exit ( - 1 ) ;    }            if (  L.length  >= L.listsize )    {        ElemType* newbase = ( ElemType* ) realloc ( L.elem , ( L.listsize + LISTINCREMENT ) * sizeof(ElemType) ) ;        if ( ! newbase )        {            printf( "追加内存失败: \n") ;            exit (-1) ;        }        L.elem = newbase ;        L.listsize += LISTINCREMENT ;    }    int p =L.length - 1 ;    for ( ; p >= i ; p -- )    {        L.elem [ p + 1 ] = L.elem [ p ];    }    L.elem [ i ] = e ;    L.length += 1 ;}void DestroyList ( Sqlist& L ){    free ( L.elem ) ;}//初始条件:La和Lb都存在//操作结果:将Lb中值加入到La中void union1 ( Sqlist & La, Sqlist& Lb ){    if ( !ListEmpty( Lb ))    {        printf( "要插入的线性表为空\n" ) ;            }    else    {        int lb = 1 ;    //一次将Lb中元素取出,和La进行比较,如果没有则加入到La中,如果有,则进行下一个元素的查找比较        while ( lb < Lb.length)        {            int la = 1 ;        if( LocateElem(La,Lb.elem [ lb ]) == 0)        {            ListInsert ( La, La.length , Lb.elem [ lb ] );        }            lb ++ ;                }    }    }int main (){    Sqlist M , N ;    InitList ( M ) ;    InitList ( N ) ;    for( M.length = 1 ; M.length < 10 ; M.length ++ )    {        M.elem [ M.length ] = M.length ;    }    for( N.length = 1 ; N.length < 10 ; N.length ++ )    {        N.elem [ N.length ] = N.length * 2 ;    }    union1 ( M , N ) ;    int x = 1 ;    for ( ; x < M.length ; x ++ )    {        printf("%d\n", *(M.elem + x ))  ;    }    ClearList ( M ) ;    ClearList ( N ) ;    DestroyList ( M ) ;    DestroyList ( N ) ;        return 0 ;}


原创粉丝点击