`
chemingliang
  • 浏览: 130394 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

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

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

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

 

0
0
分享到:
评论

相关推荐

    线性顺序表案例

    这是老师做的关于数据结构中线性顺序表的案例!

    数据结构-基于C语言实现线性顺序表的增删改查+排序,合表操作.rar

    数据结构-基于C语言实现线性顺序表的增删改查+排序,合表操作

    北京工业大学 数据结构与算法 (电控学院) 第二章线性表实验 顺序表 链表 约瑟夫环

    顺序表;2.线性链表;3.约瑟夫环。 北工大电控学院《数据结构与算法》课程的其它章节程序实验及作业代码亦已在本站上传,需要的同学可进入作者的空间或通过搜索获取。本代码为上传者原创,仅供个人学习参考使用,...

    数据结构顺序表的实现方式.docx

    数据结构顺序表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结 构,常见的线性表:顺序表、链表、栈、队列...顺序表:可动态增长的数组,要求数据是连续存储的

    数据结构之线性结构和非线性结构.pdf

    数据结构之线性结构和⾮线性结构 数据结构之线性结构和⾮线性结构 线性结构: ⼀、概念 1. 线性结构作为最常⽤的数据结构,其特点是数据元素之间存在⼀对⼀的线性关系。 2. 线性结构拥有两种不同的存储结构,即顺序...

    数据结构线性表实验报告.doc

    实验报告 "课程 "数据结构 "实验名称 "实验一 线性表 " "学号 " "姓名 " "实验日期:" " 实验一 线性表 实验目的: 1.理解线性表的逻辑结构特性; 2.熟练掌握线性表的顺序存储结构的描述方法,以及在该存储结构下的...

    线性数据结构动态演示

    java实现的线性数据结构动态演示系统,包括链表的插入,删除,合并,顺序表的插入,删除,合并,单线程

    顺序表的基本算法(实验)

    (1) 从键盘读入一组整数,按输入顺序形成顺序表。并将创建好的顺序表元素依次打印在屏幕上。 (2) 设计一个带选择菜单的主函数,菜单中具备任意选择删除、插入、查找数据元素的功能。 (3) 当选择删除功能时,从...

    数据结构知识点总结.pdf

    数据结构知识点概括 第一章 概 论 数据就是指能够被计算机识别、存储和加工处理的信息的载体。 数据元素是数据的基本单位,可以由若干个数据项组成。数据项是具有独立含义的最小标识单位。 数据结构的定义: ·逻辑...

    数据结构----顺序表

    不错 我调试过的 符合要求的nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn

    01_顺序表_线性结构_数据结构与算法

    关于数据结构中顺序表算法的实现,使用C语言代码编写程序。

    数据结构线性结构板块思维导图.pdf

    数据结构线性表,栈和队列以及串和数组章节的知识概括的思维导图,主要有线性表的定义,特点;顺序表、链表的初始化,查找,插入,删除操作的执行与算法。栈和队列的定义,特点,以及插入,删除操作,以及串和数组的...

    数据结构的三要素.pdf

    就是依据不同的数据结构⽽得出的计算⽅法,例如线性的插⼊,删除之类的 三:物理结构(物理储存) 知晓了数据结构,得到了数据计算⽅法,那么接下来就是分析这些数据在计算机硬件中的关系 1.顺序存储的数据在的物理...

    [详细完整版]数据结构习题.txt

    1.1 什么是数据结构? 1.2 数据结构涉及哪几个方面? 1.3 两个数据结构的逻辑结构和存储结构都相同,但是它们的运算集合中有一个运算的定义不一样,它们是否可以认作是同一个数据结构?为什么? 1.4 线性结构的特点...

    基于C语言实现的顺序表以及基本接口实现

    顺序表是一种线性存储结构,它采用一段连续的物理地址存储数据元素,具有元素随机存取、存储密度高、插入和删除操作效率低等特点。在顺序表中,数据元素按照一定的顺序存储,在程序中可以直接通过元素下标进行访问,...

    实验一线性表的顺序存储结构.cpp

    1.输入一组整型元素序列,建立顺序表。 2.实现该顺序表的遍历。 3.在该顺序表中进行顺序查找某一元素,查找成功返回1,否则返回0。 4.判断该顺序表中元素是否对称,对称返回1,否则返回0。 5.实现把该表中所有...

    数据结构总复习.doc

    第一章 绪论 1、 数据结构主要包括哪三方面内容? 2、 数据结构是一个二元组(D,R),其中D、R分别代表什么? 3、 什么是逻辑结构?什么是存储结构?两者有何关系? 4、 逻辑结构主要分哪两个类型? 5、 存储结构...

    数据结构-线性结构.pdf

    数据结构 数据结构-线性结构 线性结构 线性表 线性表 线性表是最简单最常见的数据结构,属于逻辑结构; 线性表有两种实现⽅式(存储⽅式),分别是顺序实现和链接实现; 定义 定义: 线性表是由n(&gt;=0)个数据元素组成的有限...

    C语言实现动态顺序表的实现代码

    顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。线性表采用顺序存储的方式存储就称之为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址...

    java顺序表的基本操作.docx

    在Java中,顺序表(Sequential List)是一种常见的线性数据结构,它以连续的内存空间存储数据元素,并按照一定的顺序进行操作。顺序表提供了一系列基本操作来插入、删除、访问和修改元素。下面是对Java顺序表的基本...

Global site tag (gtag.js) - Google Analytics