Arithmetic第二篇:顺序表的创建及基本操作

顺序表的概念:

顺序表是指按顺序存储结构存储的线性表,顺序表中的结点在内存中占用一段连续的存储单元。逻辑上相邻的数据元素,物理上也相邻。在顺序存储结构中有如下关系:
Loc(ai) = Loc(a1)+(i-1)length(1<=i<=n),其中Loc(a1)的地址为add,即只要知道顺序表的首地址和每个数据元素所占地址的单元个数,就可以求出第i个数据元素的地址。
顺序表的优点:

  1. 方法简单
  2. 存储密度大
  3. 查找速度快,时间复杂度小

顺序表的缺点:

  1. 执行效率低
  2. 需要预先分配适当的存储空间

插入操作思想:

  1. 判断位置合法性(i<1||L->i>length+1),若满足这个条件就报错,否则进行下面的操作
  2. 从所要插入数据元素的位置i到表尾的所有数据元素均需要向后移动一个存储位置, 以便能够给新插入的数据元素留出一个位置;(注:如往所插入的数据元素后一个移动,则会使后面一个结点的数据域的数据被覆盖掉)
  3. 这时会空出一个存储位置,将新的结点插入到空余位置i处
  4. 表的长度需要加一

具体代码实现(c语言):

/* 顺序表的创建及基本操作 */
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
 
// 定义符号常量
#define LIST_INIT_SIZE 60
#define LISTINCREMENT 15
#define OK 1
#define ERROR 0
#define OVERFLOW -1
 
// 定义元素类型
typedef int ElemType;
 
// 定义顺序表类型
typedef struct {
    ElemType *elem; // 顺序表元素
    int length;     // 顺序表长度
    int listsize;   // 顺序表存储容量
} SqList;
 
// 构造空顺序表
int InitList(SqList *L)
{
    // 获取顺序表基址
    L->elem = (ElemType *) malloc(sizeof(ElemType));
    // 存储空间分配失败
    if (!L->elem) return ERROR; 
    // 空表长度为0
    L->length = 0; 
    // 分配给空表的存储容量
    L->listsize = LIST_INIT_SIZE;   
    // 初始化成功
    return OK;
}
 
// 获取顺序表第i个元素
ElemType GetListElem(SqList *L, int i)
{
    // 检查i的合法性
    if (i < 1 || i > L->length) 
        return ERROR;
    else    
        return L->elem[i-1];
}
 
// 定位目标元素在顺序表中位置
int LocateListElem(SqList *L, ElemType e)
{
    int i = 1;
    // 定义指针p,指向第一个元素
    ElemType *p = L->elem;
    // 目标元素依次与顺序表元素比较
    while (*p != e && i <= L->length) 
    {
        i++;
        p++;
    }
    if (i > L->length)
        return 0;
    else
        return i;
}
 
// 在顺序表第i个位置插入元素
int InsertListElem(SqList *L, int i, ElemType e)
{
    int k;  
    // 位置合法性判断
    if (i < 1 || i > L->length + 1) return ERROR;
    // 顺序表空间满,按增量重新分配
    if (L->length >= L->listsize)
    {
        // 增加LISTINCREMENT个元素元素,获取顺序表新基址
        L->elem = (ElemType *)realloc(L->elem, (L->listsize + LISTINCREMENT) * sizeof(ElemType));
        if (!L->elem) return ERROR;
        // 按增量修改存储空间大小
        L->listsize += LISTINCREMENT;       
    }
    
    // 元素后移1位
    for (k = L->length - 1; k >= i - 1; k--) 
        L->elem[k + 1] = L->elem[k];        
    // 插入元素
    L->elem[i-1] = e;
    // 顺序表长度加1
    L->length++;
    // 插入成功
    return OK;  
}
 
// 删除顺序表第i个元素
int DeleteListElem(SqList *L, int i)
{
    int k;
    // 判断位置合法性
    if (i < 1 || i >L->length) return ERROR;
    // 元素前移1位
    for (k = i; k <= L->length; k++) 
        L->elem[k-1] = L->elem[k];
    // 顺序表长度减1
    L->length--;
    // 删除成功
    return OK;
}
 
// 修改顺序表第i个元素
int UpdateListElem(SqList *L, int i, ElemType e)
{
    // 判断位置合法性
    if (i < 1 || i >L->length) return ERROR;
    // 修改第i个元素值
    L->elem[i-1] = e;
    // 修改成功
    return OK;
}
 
// 输出顺序表全部元素
void PrintList(SqList *L) 
{
    int i;
    if (L->length == 0)
        printf("\n顺序表为空\n");
    else
        for (i = 1; i <= L->length; i++)
            printf("%d ", L->elem[i-1]);
    printf("\n");
}
 
int main()
{   
    int i, select, position;  
    ElemType data, elem;  
    int isRunning = 1;
    
    SqList *pl = (SqList *)malloc(sizeof(SqList));      
    
    while(isRunning)  
    {  
        printf("------------------------------\n");  
        printf("1. 创建一个空顺序表\n");  
        printf("2. 输出顺序表的全部数据\n");  
        printf("3. 查询顺序表某个位置的数据\n");  
        printf("4. 查询数据在顺序表中的位置\n");  
        printf("5. 向顺序表指定位置插入数据\n");  
        printf("6. 删除顺序表指定位置的数据\n");  
        printf("7. 更新顺序表指定位置的数据\n");  
        printf("8. 退出顺序表操作演示程序\n");  
        printf("------------------------------\n");  
        printf("\n输入1-8,选择所需的功能号:");  
        scanf("%d", &select);  
        printf("\n您选择的功能号为:%d\n", select);  
  
        switch(select)  
        {  
            case 1:
                if (InitList(pl)) 
                    printf("\n顺序表创建成功\n");    
                else 
                    printf("\n顺序表创建失败\n");
                system("pause");//这个是重点,圈上,它的功能主要是显示出主菜单的界面
                break;
            case 2:
                PrintList(pl);
                system("pause");
                break;
            case 3:
                printf("i=");
                scanf("%d", &i);
                elem = GetListElem(pl, i);
                if (elem) 
                    printf("L[%d]=%d\n\n", i, elem);  
                else
                    printf("输入的位置不合法");
                system("pause");            
                break;
            case 4:
                printf("data=");
                scanf("%d", &data);
                position = LocateListElem(pl, data);
                if (position)
                    printf("%d is at [%d] of the list.\n\n", data, position);
                else 
                   printf("%d is not in the list.\n\n", data);
                system("pause");
                break;
            case 5:
                printf("i,data=");
                scanf("%d,%d", &i, &data);
                if (InsertListElem(pl, i, data))
                    printf("\n数据插入成功\n");
                else 
                    printf("\n数据插入失败\n");
                system("pause");
                break;
            case 6:
                printf("i=");
                scanf("%d", &i);
                if (DeleteListElem(pl, i))
                    printf("\n数据删除成功\n");
                else
                    printf("\n数据删除失败\n");
                system("pause");
                break;
            case 7:
                printf("i,data=");
                scanf("%d,%d", &i, &data);
                if (UpdateListElem(pl, i, data))
                    printf("\n数据更新成功\n");
                else
                    printf("\n数据更新失败\n");
                system("pause");
                break;
            case 8:
                isRunning = 0;              
                break;
        }
    }
    
    printf("\n谢谢使用\n");
    return 0;
}

觉得不错的朋友请点个赞再走吧,期待下次相遇!有疑问欢迎在下方留言

发布了30 篇原创文章 · 获赞 72 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/H_W_1212/article/details/88759861