数据结构(一)线性表——顺序表

一、顺序表基本操作的实现

通常把顺序存储结构实现的线性表称为顺序表。

1.状态类型Status的定义

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2  

typedef int Status;
typedef char ElemType;

2.顺序表类型SqList的定义

#define ListSpaceIncr 20
typedef struct
{
    LElemType * base;//LElemType为顺序表的元素类型,base表示存储空间的动态数组
    int length;//顺序表长度
    int listSize;//当前的存储空间大小
}SqList;

3.初始化操作InitSqList(&L,InitSize)

Status InitSqList(SqList &L,int InitSize)
{
    L.base=(LElemType *)malloc(InitSize * sizeof(LElemType));//申请存储空间
    if(!L.base) return(OVERFLOW);//若申请失败
    L.length=0;//置为空表
    L.listSize=InitSize;
    return OK;
}

4.求长度操作listLength(L)

int listLength(SqList L)
{
    return L.length;
} 

5.判空操作listIsEmpty(L)

Status lengthIsEmpty(SqList L)
{
    if(!L.length) return TRUE;//空返回true,非空返回false
    else return FALSE;
}

6.清空操作clearList(&L)

void clearList(SqList &L)
{
    L.length=0;//将顺序表清空
}

7.取元素操作getElem(L,I,&e)

Status getElem(SqList L,int i,LElemType &e)
{
    if(!L.length) return ERROR;//先判断顺序表是否为空
    e=L.base[i-1];//由参数e返回第i个元素
    return OK;
} 

8.按值查找操作locateElem(L,e)

int locateElem(SqList L,LElemType e)
{
    int i=0;
    while(i<L.length&&! equal(L.base[i],e))
    i++;
    if(i<L.length)
    return i+1;//找到返回位序
    else return 0;//未找到返回0
} 

9.插入操作listInsert(&L,i,e)

Status listInsert(SqList &L,int i,LElemType e)//在顺序表L的第i个位置插入元素e
{
    LElemType * newBase;
    int j;
    if(i<1||i>L.length+1) return ERROR;//先判断插入位置
    if(L.length==L.listSize)
    {
        newBase=(LElemType *)realloc(L.base,(L.listSize+ListSpaceIncr)*sizeof(LElemType));//追加存储空间
        if(!newBase) return OVERFLOW;//失败
        L.base=newBase;//成功
        L.listSize+=ListSpaceIncr;
    }
    for(j=L.length-1;j>=i-1;j--)
        L.base[j+1]=L.base[j];//元素后移
    L.base[i-1]=e;//插入e
    L.length++;//长度增加1
    return OK;
} 

10.删除操作listDelete(&L,i,&e)

Status listDelete(SqList &L,int i,LElemType &e)//删除顺序表的第i个元素并返回其值
{
    int j;
    if(i<1||i>L.length) return ERROR;//若不存在
    e=L.base[i-1];
    for(j=i;j<L.length;j++)//元素前移
        L.base[j-1]=L.base[j];
    L.length--;//长度减1
    return OK;
} 

11.比较操作equal(e1,e2)

Status equal(LElemType e1,LElemType e2)//比较
{
    if(e1==e2) return TRUE;
    else return FALSE;
}

12.遍历操作listTraverse(L)

void listTraverse(SqList L)
{
    int i;
    for(i=0;i<L.length;i++)
    {
        printf("%d",L.base[i]);//遍历顺序表
    }
} 

把以上的所有内容保存到一个程序文件SqList.h中,以后使用的时候就可以直接调用顺序表的头文件来实现相应的操作了。

二、顺序表应用——集合表示与实现

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include "Status.h"
 4 typedef int LElemType;
 5 #include "SqList.h"
 6 typedef SqList mySetType;
 7 void visitSetElem(LElemType e)
 8 {
 9     printf("%d",e);
10 }
11 void createSet(mySetType &A,int n)
12 {
13     int i,e;
14     InitSqList(A,n+10);
15     printf("\t 输入%d个整数:",n);
16     for(i=0;i<n;i++)
17     {
18         scanf("%d",&e);
19         listInsert(A,i+1,e); //调用插入函数
20     }
21 }
22 void setUnion(mySetType A,mySetType B,mySetType &C)
23 {
24     int i,k,len,e;
25     clearList(C);//调用清空函数
26     k=0;
27     len=listLength(A);
28     for(i=1;i<=len;i++)
29     {
30         getElem(A,i,e);
31         listInsert(C,++k,e);//调用插入函数
32     }
33     len=listLength(B);
34     for(i=1;i<=len;i++)
35     {
36         getElem(B,i,e);
37         if(!locateElem(A,e)) listInsert(C,++k,e);//调用按值查找函数
38     }
39 }
40 void setIntersection(mySetType &A,mySetType B)
41 {
42     int i,e,len;
43     len=listLength(A);
44     i=1;
45     while(i<=len)
46     {
47         getElem(A,i,e);
48         if(!locateElem(B,e))
49         {
50             listDelete(A,i,e);//调用删除函数
51             len--;
52         }
53         else i++;
54     }
55 }
56 void outputSet(mySetType A)
57 {
58     printf("{");
59     listTraverse(A);//调用遍历函数
60     printf("}");
61 }
62 int main()
63 {
64     mySetType A,B,C;
65     int n;
66     printf("创建Set A:\n");
67     printf("\t元素数:");
68     scanf("%d",&n);
69     createSet(A,n);
70     printf("Set A=");
71     outputSet(A);
72     printf("创建Set B:\n");
73     printf("\t元素数:");
74     scanf("%d",&n);
75     createSet(B,n);
76     printf("Set B=");
77     outputSet(B);
78     InitSqList(C,listLength(A)+listLength(B)+10);
79     setUnion(A,B,C);
80     printf("\n Set C=A并B=");
81     outputSet(C);
82     setIntersection(A,B);
83     printf("Set A=A交B=");
84     outputSet(A);
85     system("pause");
86     return 0;
87 }

运行结果:

时间: 2024-10-17 19:18:52

数据结构(一)线性表——顺序表的相关文章

java实现数据结构-线性表-顺序表,实现插入,查找,删除,合并功能

package 顺序表; import java.util.ArrayList; import java.util.Scanner; public class OrderList { /** * @param args * @author 刘雁冰 * @2015-1-31 21:00 */ /* * (以下所谓"位置"不是从0开始的数组下标表示法,而是从1开始的表示法.) * (如12,13,14,15,16数据中,位置2上的数据即是13) * * 利用JAVA实现数据结构-线性表-顺

C++数据结构与算法_2_线性表 --顺序表的应用示例

h2.western { font-family: "Liberation Sans",sans-serif; font-size: 16pt; }h2.cjk { font-family: "微软雅黑"; font-size: 16pt; }h2.ctl { font-family: "AR PL UMing CN"; font-size: 16pt; }h1 { margin-bottom: 0.21cm; }h1.western { fon

C++数据结构与算法_1_线性表 --顺序表的实现与分析

顺序表的实现与分析 引 --线性表的抽象基类: template <typename T> class LinearList { public: LinearList(); ~LinearList(); virtual int Size() const = 0; //返回线性表所能够存储的最大长度 virtual int Length() const = 0; //当前线性表的长度 virtual int Search(T &x) const = 0; virtual int Loca

java数据结构与算法之顺序表与链表深入分析

转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52953190 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 ??数据结构与算法这门学科虽然在大学期间就已学习过了,但是到现在确实也忘了不少,因此最近又重新看了本书-<数据结构与算法分析>加上之前看的<java数据结构>也算是对数据结构的进一步深入学习了,于是也就打算

线性表——顺序表与单链表学习小结

线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列. 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表.链表.栈.队列.字符串... 线性表在逻辑上是线性结构,也就说是连续的一条直线.但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储. 顺序表 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储.在数组上完成数据的增删查改. 链表 链表是一种物理存储结构上非连续.非顺序的存储结构,数据

线性表&gt;&gt;顺序表---&gt;逆置所有元素

1 /*顺序表中所有的元素逆置 2 * 3 */ 4 #include <iostream.h> 5 using namespace std; 6 7 int main(){ 8 void reverse_arr(int arr[],int n); 9 int a[]={0,1,2,3,4,5,6,7}; 10 int n=7; 11 reverse_arr(a,n); 12 for(int i=0;i<=n;i++){ 13 cout << a[i] << &q

数据结构-线性表-顺序表

总括: 线性表是一种最简单的数据结构,线性表的主要操作特点是可以在任意位置插入和删除一个数据元素. 线性表可以用顺序存储结构和链式存储结构存储,用顺序存储结构实现的线性表称为顺序表,用链式存储结构实现线性表称为链表. 1,线性表概述: 线性表:线性表是一种可以在任意位置进行插入和删除数据元素操作的,有n个(n>=0)个相同类型数据元素a0,a1,. . .an组成的线性结构. 线性表抽象数据类型:抽象数据类型是指一个逻辑概念上的类型和这个类型上的操作集合:因此,线性表的抽象数据类型主要包括两个方

数据结构和算法学习总结03 线性表---顺序表

线性表是最简单.也是最基本的一种线性数据结构. 它有两种存储表示法:顺序表和链表,最基本的操作是插入.删除和查找等. 顺序表的基本操作如下: #include <stdio.h> #include <stdlib.h> #define EXIST 1 //存在数据元素,不为空 #define EMPTY 0 //为空 #define OK 1 //成功 #define ERROR 0 //出现错误 #define OVERFLOW -1 //元素溢出 const int LIST_

数据结构和算法-数据结构-线性结构-顺序表 链表和哈希表

####################################################### """ # 线性表是最基本的数据结构之一,在实际程序中应用非常广泛,它还经常被用作更复杂的数据结构的实现基础. # 根据线性表的实际存储方式,分为两种实现模型: # 顺序表, # 链表, # 下面分别进行研究, """ ####################################################### &qu

数据结构-02 _用顺序表解决线性表的编程问题

看到这个标题,相必最先应该只到什么是顺序表,什么是线性表. 线性表(linear list):由n(n>=0)个相同的数据类型的数据元素(结点)a0,a1,a2,...an-1 组成的有限序列. 顺序表:把线性表的结构按照逻辑顺序存放在一组地址连续的存储单元里,用这种方式存储的线性表简称顺序表. 线性表的基本操作: 1.初始化操作 2.插入操作:InsertNode(T a,int i) 在线性表的第i个位置插入一个值为a的新元素,使得原序号为i,i+1,...,n 的数据元素的序号变成i+1,