我的线性表(顺序表)

啦啦啦……写了将近一上午,功能不太全,只写了老师要求写的功能,待会儿我把其他功能补充下再粘贴一个

这个只有1:定义线性表,2:初始化线性表,3:删除第i个位置的元素,4:删除值为e的元素,5:查找第i个位置上的元素,6:打印顺序表 7:销毁顺序表

#include <stdio.h>
#include <malloc.h>
#define LISTINCREMENT 10
typedef struct
{
    int *elem;
    int length;
    int listsize;
}SqList;

void printMenu();//打印功能选择菜单
bool initListSq(SqList &L, int len); //初始化线性表,成功则返回1,失败返回0
bool listInsertSq(SqList &L, int i, int e);//在线性表的第i个位置插入元素e
bool listDataDeleteSq(SqList &L, int &i, int e); //删除顺序表中元素e,并返回它的位置i
bool listLocationDeleteSq(SqList &L, int i, int &e);//删除顺序表中第i个位置的元素,并返回元素的值e
bool locateElemSq(SqList &L, int &i, int e);//查找某个元素,找到则返回它的位置,否则返回0
void listPrintSq(SqList &L); //打印该线性表
void destorySq(SqList &L); //销毁该线性表

void printMenu()
{
    printf("  请选择对该线性表的操作:\n");
    printf("1:插入一个元素\n");
    printf("2:删除顺序表中第i个元素,并输出它的值e\n");
    printf("3:删除顺序表中的元素e,并输出其位置\n");
    printf("4:查找某个元素,找到则输出它的位置,否则输出0\n");
    printf("5:打印该顺序表\n");
    printf("6:销毁该顺序表\n");
    printf("q:退出程序\n");
}
int main()
{
    int len, quik = 0;
    SqList La;
    char choice;
    printf("请输入建立的顺序表的元素个数:");
    scanf("%d", &len);
    initListSq(La, len);
    for(;;) //用户在选择退出之前可以根据菜单随意对线性表进行操作;
    {
        int i, e;
        bool check;
        printMenu();
        getchar();
        scanf("%c", &choice);
        switch(choice)
        {
        case ‘1‘:
            printf("请输入要插入的元素位置和元素的值:(1 <= i <= %d)", La.length+1);
            scanf("%d%d", &i, &e);
            check = listInsertSq(La, i, e);
            if(check)
                printf("插入成功!\n");
            else
                printf("插入失败!(请检查输入的位置是否在合法范围)\n");
            break;
        case ‘2‘:
            printf("请输入要删除的元素的位置:");
            scanf("%d", &i);
            check = listLocationDeleteSq(La, i, e);
            if(check)
                printf("删除成功!\n");
            else
                printf("删除失败!(请检查输入的位置的范围或者该表是否为空)\n");
            break;
        case ‘3‘:
            printf("请输入要删除的元素的值:");
            scanf("%d", &e);
            check = listDataDeleteSq(La, i, e);
            if(check == 1)
                printf("删除成功!\n");
            else
                printf("删除失败!(请检查您输入的值是否存在于线性表中)");
            break;
        case ‘4‘:
            printf("请输入要查找的元素:");
            scanf("%d", &e);
            check = locateElemSq(La, i, e);
            if(check)
                printf("找到了,该元素在线性表中的第%d个位置上\n", i);
            else
                printf("sorry, 没找到哎,要不您再检查一下输入的元素是否是线性表中的元素?");
        case ‘5‘:
            listPrintSq(La);
            break;
        case ‘6‘:
                destorySq(La);
                printf("销毁完成!\n");
        case ‘q‘:
            quik = 1;break;
        default:
            printf("您输入的数字不在范围内,请重新输入\n");
        }
        if(quik)
        {
            printf("感谢您的使用,再见\n");
            break;
        }
    }
    return 0;
}

bool initListSq(SqList &L, int len) //构造一个空的线性表,成功则返回1,失败返回0
{
    L.elem = (int *)malloc(len*sizeof(int));
    if(!L.elem) exit(0);
    L.length = 0;
    L.listsize = len;
    return 1;
}
bool listInsertSq(SqList &L, int i, int e)
{
    //在顺序线性表中第i个位置插入新的元素e
    //i的范围 1 <= i <= L.listsize + 1
    if(i < 1 || i > L.length+1) return 0;
    if(L.length >= L.listsize)
    {
        int *newbase = (int *)realloc(L.elem, (L.listsize+LISTINCREMENT)*sizeof(int));
        if(!newbase) exit(0); //存储分配失败
        L.elem = newbase;
        L.listsize += LISTINCREMENT;
    }
    int *q = &(L.elem[i-1]), *p;
    for(p = &(L.elem[L.length-1]); p >= q; p--) *(p+1) = *p;
    *q = e;
    ++L.length;
    return 1;
}
bool listLocationDeleteSq(SqList &L, int i, int &e)//删除顺序表中第i个位置上的元素,并用e返回其值
{
    //i的范围:1 <= i <= L.listsize;
    if(L.length == 0) return 0;
    if(i < 1 || i > L.listsize) return 0;
    int *p = &(L.elem[i-1]), *q;
    e = *p;
    q = L.elem + L.listsize;
    for(p++; p < q; p++) *(p-1) = *p;
    --L.length;
    return 1;
}
bool locateElemSq(SqList &L, int &i, int e)//查找某个元素,找到则返回它的位置,否则返回0
{
    if(L.length == 0) return 0;
    i = 1;
    while(i <= L.length && L.elem[i-1] != e) ++i;
    if(i <= L.length) return 1;
    else return 0;
}
bool listDataDeleteSq(SqList &L, int &i, int e)//删除顺序表中值为e的元素,并用i返回它的位置
{
    if(L.length == 0) return 0;
    int i1;
    bool flag;
    flag = locateElemSq(L, i1, e);
    if(flag)
    {
        listLocationDeleteSq(L, i1, e);
        return 1;
    }
    else
        return 0;
}

void listPrintSq(SqList &L) //打印该线性表
{
    if(L.length == 0) {printf("该顺序表为空\n"); return ;}
    printf("该顺序表如下:\n");
    for(int i = 0; i < L.length; i++)
    {
        printf("%d ", L.elem[i]);
        if(i != 0 && i % 6 == 0)
            printf("\n");
    }
    printf("\n");
}
void destorySq(SqList &L) //销毁该线性表
{
    free(L.elem);
}
时间: 2024-08-05 01:31:45

我的线性表(顺序表)的相关文章

线性表&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

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

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

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

线性表---顺序表

线性结构的特点是:在非空的有限集合中,只有唯一的第一个元素和唯一的最后一个元素.第一个元素没有直接前驱元素,最后一个没有直接的后继元素.其它元素都有唯一的前驱元素和唯一的后继元素. 线性表是一种最简单的线性结构.线性表可以用顺序存储结构和链式存储结构存储,可以在线性表的任意位置进行插入和输出操作. 要想将线性表在计算机上实现,必须把其逻辑结构转化为计算机可识别的存储结构.线性表的存储结构主要有两种:顺序存储结构和链式存储结构. 线性表的顺序表示与实现 线性表的顺序存储结构 线性表的顺序存储结构指

线性表—顺序表

引言(重点): 1.线性表的概述 2.线性表的抽象数据类型描述 3.线性表的实现方式 4.线性表的具体实现 5.每种具体实现的分析 1.什么是线性表?线性表(Linear List):由同类型元素构成有序序列的线性结构. 特征:1.表中元素个数称为线性表的长度2.线性表没有元素时,称为空表3.表起始位置称表头,表结束位置称为表尾4.在一个元素的前面的元素叫前驱元素,在一个元素后面的元素叫后继元素. 2.线性表的抽象数据类型描述 List MakeEmpty():初始化一个空线性表L;Elemen

JAVA实现具有迭代器的线性表(顺序表)

1,先了解下JAVA类库中的迭代器:JAVA提供了两种基本类型的迭代器,分别用两个接口来表示:Iterator<T>,ListIterator<T>.其中,Iterator<T>接口中只定义了三个方法:hasNext().iterator().next(),而ListIterator<T>中,除了拥有前面所述的三种方法外,而另外拥有hasPrevious().previous().remove().set()等其他方法(具体参考JDK文档). 这说明:实现了

线性表顺序表模板 纯本人手工创造

/* ***********************************************Author        :mubaixuCreated Time  :2015-12-08 20:45:05File Name     :线性表顺序存储操作************************************************ */ 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <mal

基础数据结构-线性表-顺序表的合并操作

因为最近笔记本B面裂了准备去修,复杂些的会优先加上注释,所以在家先把代码和题目贴上来以后补文字,有疑问可以在下面留言. 顺序表的合并操作 题目描述建立顺序表的类,属性包括:数组.实际长度.最大长度(设定为1000) 已知两个递增序列,把两个序列的数据合并到顺序表中,并使得顺序表的数据递增有序输入第1行先输入n表示有n个数据,接着输入n个数据,表示第1个序列,要求数据递增互不等 第2行先输入m表示有m个数据,接着输入m个数据,表示第2个序列,要求数据递增互不等输出顺序表内容包括顺序表的实际长度和数