算法与数据结构之一------顺序表
2014-01-04 19:48
387 查看
/****************************************************************
文件内容:线性表之顺序表操作
版本V1.0
时间:2013-12-12
说明:顺便表其实就是一个数组,在数组附近添加一个标记指针。
顺序表读和写操作方便,有效信息大(相比链表来说),但查找,插入,删除效率低。
通常一个数据结构只涉及到读和写操作,一般使用顺序表来描述,而涉及到
查找,插入删除,等耗时操作,一般使用链表。
*****************************************************************/
#include<stdio.h>
#include<stdlib.h>
//#define RELEASE_VERSION //release版本开关
//#define TRIDiTION
/*inlude<malloc.h> stdlib.h 包含malloc.h*/
#ifdef RELEASE_VERSION
#define Log
#else
#define Log printf
#endif
#define MAX 15
/*为了提高程序的可移植性,千万不能使用裸露的数据类型*/
#ifndef UINT32
typedef unsigned int UINT32 ;
#endif
#ifndef INT32
typedef int INT32 ;
#endif
/*定义一个顺序表*/
#ifndef TRIDiTION
typedef struct
{
UINT32 tab[MAX]; //数组来描述顺序表
UINT32 probe; //顺便表的位置标志
} SeqList;
#else
/*也可以使用传统的结构体,传统中struct SeqList = 新型的SeqList*/
struct SeqList
{
UINT32 tab[MAX];
UINT32 probe;
} ;
#endif
/****************************************************************
函数功能:初始化顺序表
输入参数: 无
返回值: 顺序的表的标头指针
作者:HFL
时间:2013-12-12
*****************************************************************/
#ifdef TRIDiTION
struct SeqList * Init_Seqlist()
#else
SeqList * Init_Seqlist()
#endif
{
#ifdef TRIDiTION
struct SeqList * P;
P =( struct SeqList *)malloc(sizeof(SeqList));
#else
SeqList *P;
P =( SeqList *)malloc(sizeof(SeqList));
#endif
if (!P)
{
Log("malloc is failed! \n");
}
else
{
Log("malloc is secussed!\n");
}
P->probe = -1;
return P;
}
/****************************************************************
函数功能:反初始化顺序表
输入参数: 无
返回值: 顺序的表的标头指针
作者:HFL
时间:2013-12-12
*****************************************************************/
#ifdef TRIDiTION
void Uninit_Seqlist(SeqList * L)
#else
void Uninit_Seqlist(SeqList * L)
#endif
{
free (L);
return ;
}
/****************************************************************
函数功能:想顺序表i 位置插入数据
输入参数: 插入的数据值,插入的对象表
返回值: 返回值: 成功:0 ;失败:-1
作者:HFL
时间:2013-12-12
*****************************************************************/
#ifdef TRIDiTION
INT32 Insert_Into_I_Seqlist(UINT32 X, struct SeqList *L,INT32 i )
#else
INT32 Insert_Into_I_Seqlist(UINT32 X, SeqList * L,INT32 i)
#endif
{
INT32 temp ;// 有符号和无符号不能比较,因此都要统一成有符号类型
if ( i<=-1|| i>=MAX )
{
Log ("sorry the Insert position is illegal \n");
return -1;
}
if(L->probe==MAX-1 )
{
Log(" sorry!The SeqListb is FULL !\n");
return -1;
}
else
{
L->probe++;
temp = L->probe;
while(i< temp)
{
L->tab[temp]=L->tab[temp-1];
temp --;
}
L->tab[i] = X;
}
return 0;
}
/****************************************************************
函数功能:向顺序表尾部插入数据
输入参数: 插入的数据值,插入的对象表
返回值: 返回值: 成功:0 ;失败:-1
作者:HFL
时间:2013-12-12
*****************************************************************/
#ifdef TRIDiTION
INT32 Insert_Seqlist(UINT32 X, struct SeqList *L )
#else
INT32 Insert_Seqlist(UINT32 X, SeqList * L)
#endif
{
if(L->probe==MAX-1)
{
Log(" sorry!The SeqListb is FULL!\n");
return -1;
}
else
{
L->probe++;
L->tab[L->probe] = X;
}
return 0;
}
/****************************************************************
函数功能:向顺序表尾部删除数据
输入参数: 顺序表的对象表
返回值: 顺序的表的标头指针
作者:HFL
时间:2013-12-12
*****************************************************************/
#ifdef TRIDiTION
struct INT32 Delete_I_Seqlist( struct SeqList * L ,INT32 i)
#else
INT32 Delete_I_Seqlist(SeqList * L,INT32 i)
#endif
{
INT32 temp;
if (i<=-1 || i>=MAX)
{
Log("sorry!The I Position is illgeal!\n");
return -1;
}
if(L->probe==-1 )
{
Log("sorry!The SeqListb is NULL!\n");
return -1;
}
else
{
for(temp=i;temp<L->probe;temp++)
L->tab[temp]=L->tab[temp+1];
L->probe--;
}
return L->probe;
}
/****************************************************************
函数功能:向顺序表尾部删除数据
输入参数: 顺序表的对象表
返回值: 顺序的表的标头指针
作者:HFL
时间:2013-12-12
*****************************************************************/
#ifdef TRIDiTION
struct INT32 Delete_Seqlist( struct SeqList * L )
#else
INT32 Delete_Seqlist(SeqList * L)
#endif
{
if(L->probe==-1)
{
Log("sorry!The SeqListb is NULL!\n");
return -1;
}
else
{
L->probe--;
}
return L->probe;
}
/****************************************************************
函数功能:遍历顺序表
输入参数: 顺序表的对象表
返回值: 成功:0 ;失败:-1
作者:HFL
时间:2013-12-12
*****************************************************************/
#ifdef TRIDiTION
INT32 List_Seqlist( struct SeqList * L )
#else
INT32 List_Seqlist(SeqList * L)
#endif
{
INT32 Last = L->probe;
if(Last==-1)
{
Log(" sorry!The SeqListb is NULL!\n");
return -1;
}
else
{
while(-1!=Last)
{
Log( "the Nume%d is %d\n",Last, L->tab[Last]);
Last--;
}
}
return 0;
}
/****************************************************************
函数功能:从顺序表查找一个元素
输入参数: 顺序表的对象表
返回值: 成功:0,失败为:-1
作者:HFL
时间:2013-12-12
*****************************************************************/
#ifdef TRIDiTION
INT32 Seach_Seqlist( struct SeqList * L,UINT32 X )
#else
INT32 Seach_Seqlist(SeqList * L,UINT32 X)
#endif
{
UINT32 i = L->probe ; //再引入一个标志,probe指针作为顺便表指针,不能动它,否则顺序表就动了。
if(i ==-1)
{
Log(" sorry!The SeqListb is NULL!\n");
return -1;
}
else
{
while(-1!=i)
{
if( X==L->tab[i])
{
Log("The data is seached now!the %d is the %d position \n",X,i);
return L->probe;
}
// Log("L->tab[L->probe]=%d\t",L->tab[L->probe]);
i --;
}
Log("The data is can't find!\n");
return -1;
}
}
void main()
{
INT32 i = 0,Ret = -1;
#ifdef TRIDiTION
struct SeqList * L = NULL;
#else
SeqList * L = NULL;
#endif
Log("*******************************\n");
Log("* *\n");
Log("* Init seqlist is start ! *\n");
Log("* *\n");
Log("*******************************\n");
L= Init_Seqlist();
if (!L)
{
Log( "Init_seqlist is failed!\n");
}
else
{
Log("Init_seqlist is succsessed! \n");
}
Log("*******************************\n");
Log("* *\n");
Log("* setup seqlist is start ! *\n");
Log("* *\n");
Log("*******************************\n");
for(i=0; i<MAX-1; i++)//建立Max-1个元素的顺序表
{
if( Insert_Seqlist(i+2,L) )
{
Log("Insert data is failed \n");
}
else
{
Log("Insert data[%d] is successed\n",i);
}
}
Log("*******************************\n");
Log("* *\n");
Log("* List seqlist is start ! *\n");
Log("* *\n");
Log("*******************************\n");
if( List_Seqlist(L))
{
Log("List data is failed \n");
}
else
{
Log("List Data is successed\n",i);
}
Log("*******************************\n");
Log("* *\n");
Log("* Search seqlist is start ! *\n");
Log("* *\n");
Log("*******************************\n");
Ret = Seach_Seqlist(L,6);
if(-1 == Ret)
{
Log( "sorry ,List data is failded\n");
}
else
{
Log( "hi ,List data is secusssed,the position is %d\n",Ret);
}
Log("*******************************************\n");
Log("* *\n");
Log("*Insert into I position seqlist is start !*\n");
Log("* *\n");
Log("*******************************************\n");
Ret = Insert_Into_I_Seqlist(999,L,0);
if(-1 == Ret)
{
Log( "sorry ,Insert i position data is failded\n");
}
else
{
Log( "hi ,Insert i position data is secusssed\n");
}
if( List_Seqlist(L))
{
Log("List data is failed \n");
}
else
{
Log("List Data is successed\n",i);
}
Log("*******************************************\n");
Log("* *\n");
Log("* Delete seqlist is start ! *\n");
Log("* *\n");
Log("*******************************************\n");
Ret = Delete_Seqlist(L);
if(-1 == Ret)
{
Log( "sorry ,Delete data is failded\n");
}
else
{
Log( "hi ,Delete data is secusssed\n");
}
if( List_Seqlist(L))
{
Log("List data is failed \n");
}
else
{
Log("List Data is successed\n",i);
}
Log("*******************************************\n");
Log("* *\n");
Log("* Delete I Date seqlist is start ! *\n");
Log("* *\n");
Log("*******************************************\n");
Ret =Delete_I_Seqlist(L,4);
if(-1 == Ret)
{
Log( "sorry ,Delete I data is failded\n");
}
else
{
Log( "hi ,Delete I data is secusssed\n");
}
if( List_Seqlist(L))
{
Log("List data is failed \n");
}
else
{
Log("List Data is successed\n",i);
}
Log("*******************************************\n");
Log("* *\n");
Log("* destroy seqlist is start ! *\n");
Log("* *\n");
Log("*******************************************\n");
while(-1!=L->probe)
{
Delete_Seqlist(L);
}
if( List_Seqlist(L))
{
Log("List data is failed \n");
}
else
{
Log("List Data is successed\n",i);
}
Log("*******************************************\n");
Log("* *\n");
Log("* free seqlist is start ! *\n");
Log("* *\n");
Log("*******************************************\n");
Uninit_Seqlist(L);
}
文件内容:线性表之顺序表操作
版本V1.0
时间:2013-12-12
说明:顺便表其实就是一个数组,在数组附近添加一个标记指针。
顺序表读和写操作方便,有效信息大(相比链表来说),但查找,插入,删除效率低。
通常一个数据结构只涉及到读和写操作,一般使用顺序表来描述,而涉及到
查找,插入删除,等耗时操作,一般使用链表。
*****************************************************************/
#include<stdio.h>
#include<stdlib.h>
//#define RELEASE_VERSION //release版本开关
//#define TRIDiTION
/*inlude<malloc.h> stdlib.h 包含malloc.h*/
#ifdef RELEASE_VERSION
#define Log
#else
#define Log printf
#endif
#define MAX 15
/*为了提高程序的可移植性,千万不能使用裸露的数据类型*/
#ifndef UINT32
typedef unsigned int UINT32 ;
#endif
#ifndef INT32
typedef int INT32 ;
#endif
/*定义一个顺序表*/
#ifndef TRIDiTION
typedef struct
{
UINT32 tab[MAX]; //数组来描述顺序表
UINT32 probe; //顺便表的位置标志
} SeqList;
#else
/*也可以使用传统的结构体,传统中struct SeqList = 新型的SeqList*/
struct SeqList
{
UINT32 tab[MAX];
UINT32 probe;
} ;
#endif
/****************************************************************
函数功能:初始化顺序表
输入参数: 无
返回值: 顺序的表的标头指针
作者:HFL
时间:2013-12-12
*****************************************************************/
#ifdef TRIDiTION
struct SeqList * Init_Seqlist()
#else
SeqList * Init_Seqlist()
#endif
{
#ifdef TRIDiTION
struct SeqList * P;
P =( struct SeqList *)malloc(sizeof(SeqList));
#else
SeqList *P;
P =( SeqList *)malloc(sizeof(SeqList));
#endif
if (!P)
{
Log("malloc is failed! \n");
}
else
{
Log("malloc is secussed!\n");
}
P->probe = -1;
return P;
}
/****************************************************************
函数功能:反初始化顺序表
输入参数: 无
返回值: 顺序的表的标头指针
作者:HFL
时间:2013-12-12
*****************************************************************/
#ifdef TRIDiTION
void Uninit_Seqlist(SeqList * L)
#else
void Uninit_Seqlist(SeqList * L)
#endif
{
free (L);
return ;
}
/****************************************************************
函数功能:想顺序表i 位置插入数据
输入参数: 插入的数据值,插入的对象表
返回值: 返回值: 成功:0 ;失败:-1
作者:HFL
时间:2013-12-12
*****************************************************************/
#ifdef TRIDiTION
INT32 Insert_Into_I_Seqlist(UINT32 X, struct SeqList *L,INT32 i )
#else
INT32 Insert_Into_I_Seqlist(UINT32 X, SeqList * L,INT32 i)
#endif
{
INT32 temp ;// 有符号和无符号不能比较,因此都要统一成有符号类型
if ( i<=-1|| i>=MAX )
{
Log ("sorry the Insert position is illegal \n");
return -1;
}
if(L->probe==MAX-1 )
{
Log(" sorry!The SeqListb is FULL !\n");
return -1;
}
else
{
L->probe++;
temp = L->probe;
while(i< temp)
{
L->tab[temp]=L->tab[temp-1];
temp --;
}
L->tab[i] = X;
}
return 0;
}
/****************************************************************
函数功能:向顺序表尾部插入数据
输入参数: 插入的数据值,插入的对象表
返回值: 返回值: 成功:0 ;失败:-1
作者:HFL
时间:2013-12-12
*****************************************************************/
#ifdef TRIDiTION
INT32 Insert_Seqlist(UINT32 X, struct SeqList *L )
#else
INT32 Insert_Seqlist(UINT32 X, SeqList * L)
#endif
{
if(L->probe==MAX-1)
{
Log(" sorry!The SeqListb is FULL!\n");
return -1;
}
else
{
L->probe++;
L->tab[L->probe] = X;
}
return 0;
}
/****************************************************************
函数功能:向顺序表尾部删除数据
输入参数: 顺序表的对象表
返回值: 顺序的表的标头指针
作者:HFL
时间:2013-12-12
*****************************************************************/
#ifdef TRIDiTION
struct INT32 Delete_I_Seqlist( struct SeqList * L ,INT32 i)
#else
INT32 Delete_I_Seqlist(SeqList * L,INT32 i)
#endif
{
INT32 temp;
if (i<=-1 || i>=MAX)
{
Log("sorry!The I Position is illgeal!\n");
return -1;
}
if(L->probe==-1 )
{
Log("sorry!The SeqListb is NULL!\n");
return -1;
}
else
{
for(temp=i;temp<L->probe;temp++)
L->tab[temp]=L->tab[temp+1];
L->probe--;
}
return L->probe;
}
/****************************************************************
函数功能:向顺序表尾部删除数据
输入参数: 顺序表的对象表
返回值: 顺序的表的标头指针
作者:HFL
时间:2013-12-12
*****************************************************************/
#ifdef TRIDiTION
struct INT32 Delete_Seqlist( struct SeqList * L )
#else
INT32 Delete_Seqlist(SeqList * L)
#endif
{
if(L->probe==-1)
{
Log("sorry!The SeqListb is NULL!\n");
return -1;
}
else
{
L->probe--;
}
return L->probe;
}
/****************************************************************
函数功能:遍历顺序表
输入参数: 顺序表的对象表
返回值: 成功:0 ;失败:-1
作者:HFL
时间:2013-12-12
*****************************************************************/
#ifdef TRIDiTION
INT32 List_Seqlist( struct SeqList * L )
#else
INT32 List_Seqlist(SeqList * L)
#endif
{
INT32 Last = L->probe;
if(Last==-1)
{
Log(" sorry!The SeqListb is NULL!\n");
return -1;
}
else
{
while(-1!=Last)
{
Log( "the Nume%d is %d\n",Last, L->tab[Last]);
Last--;
}
}
return 0;
}
/****************************************************************
函数功能:从顺序表查找一个元素
输入参数: 顺序表的对象表
返回值: 成功:0,失败为:-1
作者:HFL
时间:2013-12-12
*****************************************************************/
#ifdef TRIDiTION
INT32 Seach_Seqlist( struct SeqList * L,UINT32 X )
#else
INT32 Seach_Seqlist(SeqList * L,UINT32 X)
#endif
{
UINT32 i = L->probe ; //再引入一个标志,probe指针作为顺便表指针,不能动它,否则顺序表就动了。
if(i ==-1)
{
Log(" sorry!The SeqListb is NULL!\n");
return -1;
}
else
{
while(-1!=i)
{
if( X==L->tab[i])
{
Log("The data is seached now!the %d is the %d position \n",X,i);
return L->probe;
}
// Log("L->tab[L->probe]=%d\t",L->tab[L->probe]);
i --;
}
Log("The data is can't find!\n");
return -1;
}
}
void main()
{
INT32 i = 0,Ret = -1;
#ifdef TRIDiTION
struct SeqList * L = NULL;
#else
SeqList * L = NULL;
#endif
Log("*******************************\n");
Log("* *\n");
Log("* Init seqlist is start ! *\n");
Log("* *\n");
Log("*******************************\n");
L= Init_Seqlist();
if (!L)
{
Log( "Init_seqlist is failed!\n");
}
else
{
Log("Init_seqlist is succsessed! \n");
}
Log("*******************************\n");
Log("* *\n");
Log("* setup seqlist is start ! *\n");
Log("* *\n");
Log("*******************************\n");
for(i=0; i<MAX-1; i++)//建立Max-1个元素的顺序表
{
if( Insert_Seqlist(i+2,L) )
{
Log("Insert data is failed \n");
}
else
{
Log("Insert data[%d] is successed\n",i);
}
}
Log("*******************************\n");
Log("* *\n");
Log("* List seqlist is start ! *\n");
Log("* *\n");
Log("*******************************\n");
if( List_Seqlist(L))
{
Log("List data is failed \n");
}
else
{
Log("List Data is successed\n",i);
}
Log("*******************************\n");
Log("* *\n");
Log("* Search seqlist is start ! *\n");
Log("* *\n");
Log("*******************************\n");
Ret = Seach_Seqlist(L,6);
if(-1 == Ret)
{
Log( "sorry ,List data is failded\n");
}
else
{
Log( "hi ,List data is secusssed,the position is %d\n",Ret);
}
Log("*******************************************\n");
Log("* *\n");
Log("*Insert into I position seqlist is start !*\n");
Log("* *\n");
Log("*******************************************\n");
Ret = Insert_Into_I_Seqlist(999,L,0);
if(-1 == Ret)
{
Log( "sorry ,Insert i position data is failded\n");
}
else
{
Log( "hi ,Insert i position data is secusssed\n");
}
if( List_Seqlist(L))
{
Log("List data is failed \n");
}
else
{
Log("List Data is successed\n",i);
}
Log("*******************************************\n");
Log("* *\n");
Log("* Delete seqlist is start ! *\n");
Log("* *\n");
Log("*******************************************\n");
Ret = Delete_Seqlist(L);
if(-1 == Ret)
{
Log( "sorry ,Delete data is failded\n");
}
else
{
Log( "hi ,Delete data is secusssed\n");
}
if( List_Seqlist(L))
{
Log("List data is failed \n");
}
else
{
Log("List Data is successed\n",i);
}
Log("*******************************************\n");
Log("* *\n");
Log("* Delete I Date seqlist is start ! *\n");
Log("* *\n");
Log("*******************************************\n");
Ret =Delete_I_Seqlist(L,4);
if(-1 == Ret)
{
Log( "sorry ,Delete I data is failded\n");
}
else
{
Log( "hi ,Delete I data is secusssed\n");
}
if( List_Seqlist(L))
{
Log("List data is failed \n");
}
else
{
Log("List Data is successed\n",i);
}
Log("*******************************************\n");
Log("* *\n");
Log("* destroy seqlist is start ! *\n");
Log("* *\n");
Log("*******************************************\n");
while(-1!=L->probe)
{
Delete_Seqlist(L);
}
if( List_Seqlist(L))
{
Log("List data is failed \n");
}
else
{
Log("List Data is successed\n",i);
}
Log("*******************************************\n");
Log("* *\n");
Log("* free seqlist is start ! *\n");
Log("* *\n");
Log("*******************************************\n");
Uninit_Seqlist(L);
}
相关文章推荐
- 二叉查找树
- 数据结构 - 图
- ConcurrentHashMap原理分析
- 数据结构 38 查找 堆排序
- (数据结构)线性表_多项式相加1_模仿
- 数据结构 37 查找 跳表 skip lists
- 数据结构 36 查找 哈希AVL
- 数据结构 35 查找 哈希红黑树
- 数据结构 33 查找 AVL树
- 数据结构 32 查找 二叉搜索树
- 数据结构 31 查找 搜索二叉树 哈希查找 中位数
- 数据结构 30 查找 二分查找
- 数据结构 29 排序 自己实现 插入排序 插入和归并综合排序 给链表排序
- 数据结构 28 排序 计数排序 基数排序 桶排序
- 数据结构 27 排序 排序-选择 插入 冒泡 希尔 快速归并 6种排序
- 数据结构 26 排序 归并 快排使用精简栈深度优化
- 数据结构 25 哈希 一致性哈希
- 数据结构 24 哈希 key-value 存储于查找 自己实现
- 数据结构 23 哈希 哈希链表 自己实现
- 数据结构 22 哈希 实现