您的位置:首页 > 理论基础 > 数据结构算法

数据结构之顺序表

2015-10-18 23:37 363 查看
Sequence.h

/* 线性表的动态分配顺序存储结构 */
#define LIST_INIT_SIZE 10 /* 线性表存储空间的初始分配量 */
#define LIST_INCREMENT 2 /* 线性表存储空间的分配增量 */
typedef struct
{
int     *elem;
int     length;
int     listsize;
}SqList;
void    InitList(SqList *L);
void    Destroy(SqList *L);
void    ClearList(SqList*L);
int     ListEmpty(SqList L);
int     ListLength(SqList L);
int     GetElem(SqList L, int i, int *e);//查找线性表中此元素是否存在;
int     LocateElem(SqList L, int e, int(*compare)(int, int));
int     PriorElem(SqList L, int cur_e, int *Pre_e);
int     NextElem(SqList L,int cur_e,int *next_e);
int     ListInsert(SqList *L, int i, int e);
int     ListDelete(SqList *L, int i, int *e);
void    ListTraverse(SqList L, void(*vi)(int *));


Sequence.c

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include "Sequence.h"
void InitList(SqList *L)
{
L->elem = malloc(LIST_INIT_SIZE*sizeof(int));
if (!L->elem)
{
exit(0);
}
L->length = 0;
L->listsize = LIST_INIT_SIZE;
}
void InputList(SqList *L)
{
int *p = L->elem;
printf("Please input the init dade:\n");
for (int i = 0; i< L->listsize;i++)//这里将L->length 改为LIST_INIT_SIZE
{
scanf("%d",p++);
}
}

void Destroy(SqList *L)
{
free(L->elem);
L->elem = NULL;
L->length = 0;
L->listsize = 0;
}
void ClearList(SqList*L)
{
L->length = 0;
}
int ListEmpty(SqList L)
{
if (L.length == 0)
return 1;
else
return 0;
}
int ListLength(SqList L)
{
return L.length;
}
int     GetElem(SqList L, int i, int *e)//查找线性表中此元素是否存在;
{
if (i<1||i>L.length)
{
return 0;
}
*e = *(L.elem + i - 1);
return 1;
}

int     LocateElem(SqList L, int e, int(*compare)(int, int))//查找该元素所在的位置;
{
int *p;
int i = 1;
p = L.elem;
while (i <= L.length&&!compare(*p++, e))
++i;
if (i <= L.length)
return i;
else
return 0;

}
int     PriorElem(SqList L, int cur_e, int *Pre_e)
{
int i = 2;
int *p = L.elem + 1;
while (i < L.length&&*p != cur_e)
{
p++;
i++;
}
if (i > L.length)
return 0;
else
{
*Pre_e = *--p;
return 1;
}
}
int     NextElem(SqList L, int cur_e, int *next_e)
{
int i = 1;
int *p = L.elem;
while (i < L.length&&*p != cur_e)
{
i++;
p++;
}
if (i == L.length)
return 0; /* 操作失败 */
else
{
*next_e = *++p;
return 1;
}
}
int     ListInsert(SqList *L, int i, int e)//在第i个位置插入数字e;
{
int * newbase, *q, *p;
if (i<1 || i>L->length + 1)
return 0;
if (L->length>=L->listsize)
{
newbase = realloc(L->elem, (L->listsize + LIST_INIT_SIZE)*sizeof(int));
if (!newbase)
exit(0);
L->elem = newbase;
L->listsize += LIST_INIT_SIZE;
}
q = L->elem + i - 1;
for (p = L->elem + L->length - 1; p >= q;--p)
{
*(p + 1) = *p;
}
*q = e;
++L->length;
return 1;
}
int     ListDelete(SqList *L, int i, int *e)
{
int  *p, *q;
if (i<1 || i>L->length) /* i值不合法 */
return 0;
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 1;

}
void print(SqList L)
{
int *p = L.elem;
for (int i=0; i <L.listsize;i++)
{
printf("%d  ",*(p++));

}
printf("\n");
}

void    ListTraverse(SqList L, void(*vi)(int *))
{
int *p;
int i;
p = L.elem;
for (i = 1; i <= L.length; i++)
vi(p++);
printf("\n");
}
int main()
{
SqList SqlistTest ;//SqList *SqlistTest;
InitList(&SqlistTest);//InitList(SqlistTest);两种传递方式
InputList(&SqlistTest);//由于初始化时里面内容为空所以长度为空但是代码错误,所以可改;错误之处是指针应用错误,对线性表存储数据处理解错误
printf("%d",ListLength(SqlistTest));
printf("%d", ListEmpty(SqlistTest));
printf("销毁数据前\n");
print(SqlistTest);
Destroy(&SqlistTest);
printf("销毁数据后\n");
print(SqlistTest);

//printf("%d", GetElem(SqlistTest,5,1));

system("pause");
return 0;
}


严蔚敏的数据结构之顺序表
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: