/************************************************************************/
/* 数据结构:动态线性顺序表 */
/* 挑灯看剑-shuchangs@126.com 2010-10 */
/* 云歌国际(Cloud Singers International) www.cocoral.com */
/************************************************************************/
#include "core.h"
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define LIST_SIZE sizeof(LIST)
#define LIST_INIT_SIZE 10
#define LIST_INCREMENT 5
typedef struct
{
int* elem; //存储空间基地址
int length; //当前长度
int listsize;//当前分配的存储容量
}SqList;
void main()
{
//******函数原型【开始】***************
Status InitList_Sq(SqList* list);
void printList(SqList list);
void printListElem(SqList list);
Status ListInsert_Sq(SqList* L, int i, int e);
Status ListDelete_Sq(SqList* L, int i, int* e);
void autoList_Sq(SqList* L, int n);
Status compare(int e1, int e2);
Status LocateElem_Sq(SqList* L, int e, int* i, Status(*compare)(int, int));
//******函数原型【结束】***************
SqList L =
{
NULL, NULL, NULL
};
if (InitList_Sq(&L))
{
int i = 0, e = 0;
char tag = 'Y'; //输入其他字符结束输入
/*
//动态创建线性顺序表
puts("请输入插入元素位置和元素值!");
scanf("%d %d %c", &i, &e, &tag);
while (tag == 'Y')
{
if (ListInsert_Sq(&L, i, e))
{
puts("插入成功!");
printList(L);
printListElem(L);
}
else
{
puts("插入失败!");
}
puts("请输入插入元素位置和元素值!");
scanf("%d %d %c", &i, &e, &tag);
}
*/
autoList_Sq(&L, 7); //自动化生成线性顺序表
//执行删除操作
puts("请输入删除元素位置!");
scanf("%d", &i);
if (ListDelete_Sq(&L, i, &e))
{
puts("删除成功!");
printf("当前删除元素e=%d\n", e);
}
else
{
puts("删除失败!");
}
printList(L);
printListElem(L);
puts("请输入要查找的元素!");
scanf("%d", &e);
if (LocateElem_Sq(&L, e, &i, compare))
{
puts("查找成功!");
printf("查找元素e=%d,位于第%d位置!\n", e, i + 1);
}
else
{
puts("查找失败!");
}
}
}
Status InitList_Sq(SqList* list)
{
list->elem = (int *) malloc(LIST_INIT_SIZE * sizeof(int));
if (!(list->elem))
exit(OVERFLOW);
list->length = 0;
list->listsize = LIST_INIT_SIZE;
return OK;
}
void printList(SqList list)
{
printf("线性表基地址:%d,线性表长度:%d,线性表当前分配的存储容量:%d\n",
list.elem, list.length, list.listsize);
}
void printListElem(SqList list)
{
int i = 0, n = list.length;
for (; i < n; i++)
{
printf("elem[%d]= %d\n", i + 1, list.elem[i]);
}
}
//在线性顺序表的第i个位置插入元素e
Status ListInsert_Sq(SqList* L, int i, int e)
{
Status ListEmpty(SqList L); //函数原型
//插入前预备性工作
//如果是空表,就将该元素置为第1个位置
if (ListEmpty(*L))
{
*L->elem = e;
L->length = 1;
puts("插入前线性表为空表,插入元素默认置于第1个位置!");
return OK;
}
//如果插入点i不合要求
if (i<1 || i>L->length + 1)
return ERROR;
//如果当前线性列表的长度等于或大于分配的存储容量
if (L->length >= L->listsize)
{
//重新分配存储空间
int* newbase = (int*) realloc(L->elem,
(L->listsize + LIST_INCREMENT) * sizeof(int));
if (!newbase)
exit(OVERFLOW);
L->elem = newbase;
L->listsize += LIST_INCREMENT;
}
//开始插入操作
int* q = L->elem + (i - 1);
//第i个位置到第n位置上的数据先后移一位
int* p = L->elem + (L->length - 1);
for (; p >= q; p--)
*(p + 1) = *p;
*q = e;
++L->length;//长度加1
return OK;
}
//删除线性链表中第i个位置元素,并用元素e返回之
Status ListDelete_Sq(SqList* L, int i, int* e)
{
Status ListEmpty(SqList L);//函数原型
//删除前判断
//如果是空表
if (ListEmpty(*L))
{
puts("删除失败,线性表是空表!");
return ERROR;
}
//如果i超出范围
if (i<1 || i>L->length)
return ERROR;
//如果i符合删除要求
int* p = L->elem + i - 1; //删除位置指针
int* q = L->elem + L->length - 1; //尾指针
*e = *p;
for (; p < q; p++)
{
*p = *(p + 1);
}
--L->length; //长度减1
return OK;
}
Status ListEmpty(SqList L)
{
//初始条件:线性表L已存在
//操作结果:若L为空表,则返回TRUE,否则返回FALSE。
if (L.length <= 0)
return TRUE;
else
return FALSE;
}
void autoList_Sq(SqList* L, int n)
{
//Status ListInsert_Sq(SqList* L, int i, int e);
void printList(SqList list);
void printListElem(SqList list);
int i = 0;
for (; i < n; i++)
{
ListInsert_Sq(L, i + 1, i + 1);
}
printList(*L);
printListElem(*L);
}
//在线性顺序表L中查找元素e,如果成功用i值返回所在位置,并返回TRUE,否则返回FALSE
Status LocateElem_Sq(SqList* L, int e, int* i, Status(*compare)(int, int))
{
int* p = L->elem; //头指针
int* q = L->elem + L->length - 1; //尾指针
for (*i = 0; p <= q; p++)
{
if ((*compare) (*p, e))
break;
++ * i;
}
if (*i < L->length)
return OK;
else
return ERROR;
}
Status compare(int e1, int e2)
{
if (e1 == e2)
return TRUE;
else
return FALSE;
}
运行结果测试如下:
插入前线性表为空表,插入元素默认置于第1个位置!
线性表基地址:3671976,线性表长度:7,线性表当前分配的存储容量:10
elem[1]= 1
elem[2]= 2
elem[3]= 3
elem[4]= 4
elem[5]= 5
elem[6]= 6
elem[7]= 7
请输入删除元素位置!
5
删除成功!
当前删除元素e=5
线性表基地址:3671976,线性表长度:6,线性表当前分配的存储容量:10
elem[1]= 1
elem[2]= 2
elem[3]= 3
elem[4]= 4
elem[5]= 6
elem[6]= 7
请输入要查找的元素!
2
查找成功!
查找元素e=2,位于第2位置!
Press any key to continue