考研王道数据结构-顺序表(基本操作)

1、本代码实现与王道和严蔚敏老师的教材基本保持一致。此代码主要用于考研用,为简化代码,顺序表并没有像严蔚敏老师的教材上那样使用动态分配。

2、注意本代码中元素的位置i=(元素的下标+1)。即线性表中元素的位置是从1开始的,而数组中元素的下标是从0开始的。

所以插入位置的范围是(1=<i<=L.length+1),删除位置的范围是(1<=i<=L.length)。 (插入位置一般是在指定位置之前。)

(根据王道单科)

假设元素个数为n个:

在任意位置插入元素的概率为1/(n+1)                    |         在任意位置删除元素的概率为1/n

在i位置插入元素需移动(n-i+1)个元素                    |        在i位置删除元素需移动(n-i)个元素    

在任意位置插入元素的概率为1/(n+1)                    |         在任意位置删除元素的概率为1/n

有些看了天勤数据结构的同学可能会疑问,为什么天勤里面写的却是

在任意位置插入元素的概率为1/(n+1)                    |         在任意位置删除元素的概率为1/n

在i位置插入元素需移动(n-i)个元素                    |        在i位置删除元素需移动(n-i-1)个元素    

在任意位置插入元素的概率为1/(n+1)                    |         在任意位置删除元素的概率为1/n

这是因为天勤的书他的元素位置i也是从0开始的,因此它的元素的位置i=元素的下标。他的书其实很多地方都简化了代码。比如说没有再写ElemType,而是直接写int类型等等。

好了,让我们看看代码吧。

本代码实现函数有:

void InitList(Sqlist &L)
bool ListInsert(Sqlist &L,int i,ElemType e)
bool ListDelete(Sqlist &L,int i,ElemType &e)
bool getElem(Sqlist L,int i,ElemType &e)
int LocateElem(Sqlist L,ElemType e)

void ListLoad(Sqlist L)
#include<stdio.h>
#define true 1
#define false 0
#define MaxSize 100          //定义线性表的最大长度 
#define ElemType int
#define Status int 


typedef struct{
    ElemType data[MaxSize];        //动态分配数组的指针
    int length;            //当前个数 
}Sqlist;

//构造一个空的线性表L 
void InitList(Sqlist &L){
    L.length=0;
}


bool ListInsert(Sqlist &L,int i,ElemType e){ 
//将元素e插到顺序表L中第i个位置 
    if(i<1||i>L.length+1)
        return false;
    if(L.length>=MaxSize)
        return false;
    for(int j=L.length;j>=i;j--)
        L.data[j]=L.data[j-1];
    L.data[i-1]=e;
    L.length++;
    return true;
}

bool ListDelete(Sqlist &L,int i,ElemType &e){
//删除L中第i个位置的元素 
    if(i<1||i>L.length)
        return false;
    e=L.data[i-1];
    for(int j=i;j<L.length;j++)
        L.data[j-1]=L.data[j];
    L.length--;
    return true;
} 

//用e返回L中第i个数据元素的值 
bool getElem(Sqlist L,int i,ElemType &e){
    if(i<1||i>L.length)return false;
    e=L.data[i-1];
    return true; 
} 

//返回L中第一个元素值等于e的位置 
int LocateElem(Sqlist L,ElemType e){
    int i;
    for(i=0;i<L.length;i++)
        if(L.data[i]==e)
            return i+1;        //返回所找元素的位置 
    return 0;         //退出循环,没找到这个元素 
} 

void ListLoad(Sqlist L){
    if(L.length==0){
        printf("当前顺序表为空\n");
        return;
    }
    printf("当前顺序表元素为:");
    for(int i=0;i<L.length;i++)
        printf("%d ",L.data[i]);
    printf("\n");
    return;
}

int main(){
    Sqlist T;
    ElemType e,x;
    int a,i;
    InitList(T);
    
    while(1){
        printf("1:插入元素到指定位置\n");  //ListInsert
        printf("2:删除指定位置元素\n");   //ListDelete
        printf("3:找到指定元素的位置\n");  //LocateElem 
        printf("请选择:");
        scanf("%d",&a); 
        switch(a){
            case 1:scanf("%d %d",&i,&x);
                    if(ListInsert(T,i,x))printf("元素%d成功插入%d位置\n",x,i);
                    else printf("插入失败\n"); 
                    break;
            case 2:scanf("%d",&i);
                    if(ListDelete(T,i,e))printf("成功删除%d位置元素,该元素为%d\n",i,e);
                    else printf("删除失败\n");
                    break;
            case 3:scanf("%d",&e);
                    if(!LocateElem(T,e))printf("未找到该元素\n");
                    else printf("该元素位于%d\n",LocateElem(T,e)); 
                    break;
            default:return 1;
        }
        ListLoad(T);
    } 
} 
 
 
 
 

 插入元素ListInsert:

删除元素(ListDelete):

 

查找指定元素的位置(LocateElem)

猜你喜欢

转载自www.cnblogs.com/double891/p/9124828.html