顺序表及其基本操作

顺序表详解

顺序表存储逻辑关系为“一对一”的顺序。在存储数据之前,要提前申请好一块足够大小的物理空间。

顺序表初始化

使用顺序表存储数据之前,除了要申请足够大小的物理空间之外,为了方便后期使用表中的数据,顺序表还需要实时记录以下 2 项数据:
1、顺序表申请的存储容量;
2、顺序表的长度,也就是表中存储数据元素的个数;
因此我们要自定义顺序表,C语言代码如下:


typedef int ElemType;

typedef struct seqlist {
    
    
	ElemType *elem;		//声明了一个大小不确定的数组,也成为“动态数组”
	int length;			//记录顺序表数据当前大小
}seqlist;

申请空间的大小我们用一个宏定义

#define MAXSIZE	10		//对MAXSIZE进行宏定义,表示顺序表申请空间的大小
#define FALSE 0			//后续会用到,不必理解
#define TRUE 1			//后续会用到,不必理解

typedef unsigned char boolean;		

下面就是初始化顺序表初始化

boolean initList(seqlist* List1) {
    
    		//返回值为boolean类型的一个函数
    List1->elem = (int*)malloc(MAXSIZE * sizeof(int));   //构造一个空的顺序表,动态申请存储空间
    if (!List1->elem) {
    
                                      //如果申请失败,作出提示并直接退出程序
            printf("初始化失败");
            return FALSE;			//前面进行的宏定义,符合返回值类型,看起来会很方便	
    }
    List1->length = 0;//空表的长度初始化为0
    return TRUE;
}

上面是初始化顺序表,对顺序表进行空间的申请
下面是对顺序表的处理

顺序表插入元素

通过遍历顺序表,找到数据插入位置,然后做下面两步

  • 将要插入元素位置后面的所有元素整体往后移动
  • 讲元素放入位置
    例如在{1,2,3,4,5}顺序表中,在4的位置插入元素6,只需将5,6往后移动,然后将6,放在4的位置。找到目标元素4,将其本身以及后面的元素往后移动,然后把6放在4的位置
//插入函数,其中,elem为插入的元素,add为插入到顺序表的位置
seqlist addseqlist(seqlist t,int elem,int add)
{
    
    
    //判断插入本身是否存在问题(如果插入元素位置比整张表的长度+1还大(如果相等,是尾随的情况),或者插入的位置本身不存在,程序作为提示并自动退出)
    if (add > seqlist.length + 1||add < 1) {
    
    
        printf("插入位置有问题");
        return seqlist;
    }
    //插入操作,需要将从插入位置开始的后续元素,逐个后移
    for (int i = seqlist.length - 1; i >= add - 1; i--) {
    
    
        seqlist.elem[i+1]=seqlist.elem[i];
    }
    //后移完成后,直接将所需插入元素,添加到顺序表的相应位置
    seqlist.elem[add-1]=elem;
    //由于添加了元素,所以长度+1
    seqlist.length++;
    return seqlist;
}

以上就实现了顺序表插入元素,一定要记住,插入元素后,顺序表长度要加一。

输出元素

将顺序表中的元素遍历输出

void showelem(const seqlist *List1) {
    
    
    int i;

    for (i = 0; i < List1->length; i++) {
    
    
        printf("%d ", List1->elem[i]);
    }
    printf("\n");
}

顺序表删除一段元素

将顺序表要删除这段元素的后面元素往前挪动,即覆盖掉删除的元素。删除一个元素,那就让i,j的值相同。

boolean DeleteList(seqlist *List1, int i, int j) {
    
    
    if (i < 0 || j < 0 || i > MAXSIZE || j >= MAXSIZE) {
    
    
        printf("删除区域有误!\n");
        return FALSE;
    }
    for (j; j < MAXSIZE; j++) {
    
    
        List1->elem[i - 1] = List1->elem[j];	//将被删除这段元素的下一个元素,挪动到删除的第一个元素处,以此类推
        i++;
    }
    List1->length = MAXSIZE - (j - i) - 1;		//删除元素后长度的大小
	showelem(List1);		//遍历输出删除后的元素
    return TRUE;
}

顺序表元素的查找

//查找函数,其中,elem表示要查找的数据元素的值
int selectTable(seqlist List1,int elem){
    
    
    for (int i=0; i<List1.length; i++) {
    
    
        if (List1.elem[i]==elem) {
    
    
            return i+1;			//下表为i,元素所在位置为i+1
        }
    }
    return -1;//如果查找失败,返回-1
}

顺序表更改元素

顺序表更改元素的实现过程为:

  1. 找到要更改元素;
  2. 直接修改该元素的值。

代码实现如下:

//更改函数,其中,elem为要更改的元素,newElem为新的数据元素
seqlist amendTable(seqlist List1,int elem,int newElem){
    
    
    int add=selectTable(List1, elem);		//调用查找元素函数
    List1.elem[add-1]=newElem;		//返回的是元素在顺序表中的位置,所以-1就是该元素在数组中的下标
    return List1;
}

线性表的基本操作到此结束。如有疑问请戳头像联系。

猜你喜欢

转载自blog.csdn.net/adaizzz/article/details/104748838