数据结构:动态线性顺序表

/************************************************************************/

/* 数据结构:动态线性顺序表                                                                        */

/* 挑灯看剑-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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值