四极管:数据结构2

上面上传的代码部分使用代码文本方式,显示有问题·还是直接上文本吧·

概念少说,直接上代码:代码来源于清华大学严老师的数据结构C语言版,再次只是自己分析和学习。

算法1:将两个或者两个以上的线性表合并为一个线性表

 以下是.cpp文件

#include"define.h" /*头文件及数据类型定义*/

/*ElemType是数据结构书上为了说明问题而用的一个词,他是element type("元素的类型")的简化体,使用过程中这个代表肯能的数据类型,在此定义为int*/

typedef int ElemType;

 

#include"StructDefine.h" /*线性表的动态分配顺序存储结构*/

#include "List.cpp"   /*顺序表示的线性表(存储结构由define.h定义)的基本操作(12个)*/

 

/*判断是否相等的函数,Union()用到*/

Status equal( ElemType c1, ElemType  c2 )

{

       if( c1 == c2 )

       {

              return TURE;

       }    

       else

       {

              return FALSE;

       }

 

}

/*将所有的线性表Lb中但是不在La中数据元素插入到La中*/

void Union( SqList &La, SqList Lb )

{

       ElemType e;

       int La_len,Lb_len;

       int i;

       La_len = ListLength( La );          /*求线性表La的长度*/

       Lb_len = ListLength( Lb );          /*求线性表La的长度*/

      

       for( i = 1; i < Lb_len; i++)

       {

              GetElem( Lb, i, e );             /*取Lb中的第i个数据元素赋值给e*/

              if( !LocateElem( La, e, equal ) )         /*La中不存在和e相同的元素,则插入*/

              {

                     ListInsert(La,++La_len,e); 

              }

       }

}

/*打印显示*/

void print( ElemType &c )

{

       printf( "%d", c);

}

 

/*主函数*/

void main()

{

       Sqlist La,Lb;

       Status i;

       int j;

       i = InitList( La );

       if( i == 1)                            /*创建空表La成功*/

       {

              for( j = 1; j <= 5; j++)           /*在表La中插入5个元素*/

              {

                     i = ListInsert( La,i,j );

              }

       }

       printf( "La = " );                     /*输出表La的内容*/

       ListTraverse( La,print );

       InitList( Lb );                               /*也可不判断是否创建成功*/

       for( j = 1; j <= 5; j++)                    /*在表Lb中插入5个元素*/

       {

              i = ListInsert( Lb, j, 2*j );

       }

       printf( "Lb = " );                 /*输出表Lb的内容*/

       ListTraverse( Lb,printf );

       Union( La,Lb );

       printf("new La = ");                        /*输出新表La的内容*/

       ListTraverse(La,print);

}

 

头文件define.h

#include <string.h>

#include <ctype.h>

#include <malloc.h>   /*molloc等*/

#include <limits>     /*INI_MAX等*/

#include <stdio.h>    /*EOF(=^Z或F6),NULL*/

#include <stdlib.h>   /*atoi()*/

#include <io.h>       /*eof()*/

#include <math.h>     /*floor(), cell(),abs()*/

#include <process.h>  /*exit()*/

#include <iostream.h> /*cout,cin*/

 

/*函数结果状态码*/

#define TRUE                  1

#define FALSE             0

#define OK                1

#define ERROR                0

#define INFEASIBLE    -1

 

/*#define OVERFLOW -2因为在main.h中已定义OVERFLOW的值为3,故去掉此行*/

typedef int Status;       /*Status是函数的类型,其值是函数结果状态码,如OK等*/

typedef int Boolean;      /*Boolean是布尔类型,其值是TRUE或FALSE*/

 

StructDefine.h头文件

 /*线性表的动态分配顺序存储结构*/

#define LIST_INIT_SIZE      10

#define LISTINCRMENT        2

struct Sqlist

{

       ElemType *elem;      /*存储空间的基址*/

       int length;          /*当前长度*/

       int listsize;        /*当前分配的存储内容(以sizeof(ElemType)为单位)*/

};

 

List.cpp

/*顺序表示的线性表(存储结构由StructDefine.h)定义的基本操作(12个)*/

 

/*操作结果:构造一个空的顺序线性表*/

Status InitList( SqList &L )

{

       L.elem = ( ElemType* )malloc(LIST_INT_SIZE * sizeof(ElemType));

       if(!L.elem)

       {

              exit(OVERFLOW); /*存储分配失败*/

       }

       L.length = 0;      /*空表长度为0*/

       L.listsize = LIST_INIT_SIZE;     /*初始存储容量*/

       return OK;

}

/*初始条件:顺序线性表L已存在。操作结果:销毁顺序线性表L*/

Status DestroyList( SqList &L )

{

       free(L.elem);

       L.elem = NULL;

       L.length = 0;

       return OK;

}

/*初始条件:顺序线性表L已存在。操作结果:将L重置为空表*/

Status ClearList( SqList &L )

{

       L.length = 0;

       return OK;

}

/*初始条件:顺序线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE*/

Status ListEmpty( SqList L )

{

       if(L.length == 0)

       {

              return TRUE;

      }

       else

       {

              return FALSE;

       }    

}

/*初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数*/

int ListLength(SqList L)

{

       return L.length;

}

/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)

   操作结果:用e返回L中第i个数据元素的值

*/

 

Status GetElem( SqList L, int i, ElemType &e )

{   

       if( (i < 1) || (i > L.length))

          exit( ERROR );

     e = *( L.elem+i-1 );

     return OK;

}

/* 初始条件:顺序线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0)

   操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。

   若这样的数据元素不存在,则返回值为0。

*/

int LocateElem( SqList L,ElemType e,Status( *compare )( ElemType, ElemType ) )

{   

       ElemType *p;

       int i=1;          /* i的初值为第1个元素的位序*/

       p=L.elem;      /* p的初值为第1个元素的存储位置*/

       while( i <= L.length && !compare( *p++,e ) )

       {

              ++i;

       }

       if( i <= L.length )

       {

              return i;

       }

       else

       {

              return 0;

       }

}

/* 初始条件:顺序线性表L已存在

   操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,

   否则操作失败,pre_e无定义

*/

Status PriorElem( SqList L, ElemType cur_e, ElemType &pre_e )

{   

       int i=2;

     ElemType *p=L.elem+1;

     while( i <= L.length && *p! = cur_e)

     {

                 p++;

                 i++;

     }

     if( i > L.length )

       {

                 return INFEASIBLE;

       }

     else

     {

                 pre_e = *--p;

                 return OK;

     }

}

/* 初始条件:顺序线性表L已存在

   操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,

   否则操作失败,next_e无定义

*/

 

Status NextElem( SqList L, ElemType cur_e, ElemType &next_e )

{   

       int i = 1;

     ElemType *p = L.elem;

     while( i < L.length && *p! = cur_e)

     {

                 i++;

                 p++;

     }

     if( i == L.length )

       {

                 return INFEASIBLE;

       }

     else

     {

                 next_e = *++p;

                 return OK;

     }

}

/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)+1

   操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1

*/

 

Status ListInsert(SqList &L,int i,ElemType e)

{   

       ElemType *newbase, *q,*p;

     if(i < 1 || i > L.length + 1)            /* i值不合法*/

       {

                 return ERROR;

      }   

       if(L.length >= L.listsize)                     /* 当前存储空间已满,增加分配*/

     {

                 if( !( newbase = ( ElemType * ) realloc ( L.elem, (L.listsize+LISTINCREMENT)*sizeof(ElemType))) )

                exit( OVERFLOW );                   /* 存储分配失败*/

                 L.elem = newbase;                      /* 新基址*/

                 L.listsize += LISTINCREMENT; /* 增加存储容量*/

     }

     q = L.elem + i - 1;                      /* q为插入位置*/

     for( p = L.elem + L.length - 1; p >= q; --p ) /* 插入位置及之后的元素右移*/

          *(p+1) = *p;

     *q=e;                                 /* 插入e*/

     ++L.length;                         /* 表长增1*/

     return OK;

 }

/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)

   操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1

*/

 Status ListDelete(SqList &L,int i,ElemType &e)

 {   

       ElemType *p,*q;

     if( i < 1 || i > L.length )                /* i值不合法*/

       {

                 return ERROR;

       }

     p = L.elem + i - 1;                             /* p为被删除元素的位置*/

     e = *p;                                      /* 被删除元素的值赋给e*/

     q = L.elem + L.length - 1;                          /* 表尾元素的位置*/

     for( ++p; p <= q; ++p)                       /* 被删除元素之后的元素左移*/

          *(p-1) = *p;

     L.length--;                                 /* 表长减1*/

     return OK;

 }

/* 初始条件:顺序线性表L已存在

   操作结果:依次对L的每个数据元素调用函数vi()。一旦vi()失败,则操作失败

   vi()的形参加'&',表明可通过调用vi()改变元素的值

*/

Status ListTraverse(SqList L,void(*vi)(ElemType&))

{   

       ElemType *p;

     int i;

     p = L.elem;

     for( i = 1; i <= L.length; i++)

          vi(*p++);

     cout << endl;

     return OK;

 }

 

 

 

转载请注明出处。作者:四极管。广西师范大学 电子工程学院大学生科技创新基地 邮箱: yangxingbo-0311@163.com

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值