线性表之顺序表

线性表的顺序存储是指,在内存中用地址连续的一块存储空间,顺序存放线性表的各元素,用这种存储形式存储的线性表成为顺序表

顺序表的基本操作

1. 顺序表的结构定义

首先我们来定义顺序表

typedef struct LNode{
  int data[MAX];
  int Length;
}SeqList;
int arr[]={1,5,6,3,9,7};/* 定义一个要输入的数组 */

 

2. 初始化顺序表

SeqList *ListCreat(){
  SeqList *L;
  L=(SeqList *)malloc(sizeof(SeqList));
  for (int i = 0; i < sizeof(arr)/4; i++){ /* 向data填入arr中的数据 */
    L->data[i] = arr[i];
  }
  L->Length=sizeof(arr)/4;
  return L;
}

 

3. 插入运算

线性表的插入是指在第i个位置插入元素x,插入后使原表长n变为n+1,顺序表上插入运算主要步骤如下:

将ai~an的元素顺序向后移动,将x放到空出的第i个位置,修改表长

int ListInsert(SeqList *L, int pos, int ele){
  if(pos>L->Length+1 || pos<1){
    printf("位置错");
    return -1; /* 检查插入位置正确性 */
  }
  if(L->Length == MAX){  /* 表满 */
    printf("表满");
    return 0;
  }
  for (int i = L->Length-1; i > pos-2; i--){
    L->data[i+1]=L->data[i]; /* 节点移动 */
  }
  L->data[pos-1] = ele; /* 新元素插入 */
  L->Length++; /* 表长+1 */

  return 1; /* 插入成功返回1 */
}

  时间复杂度O(n),n/2。

 

4. 删除元素

删除运算的主要步骤为:将ai+1~an顺序向前移动, 修改表长。

int ListDel(SeqList *L,int pos){
  if(pos>L->Length || pos<1){ /* 检查删除位置合法性 */
    printf("无法删除第%d个元素",pos);
    return 0;
  }
  for(int i=pos-1; i < L->Length; i++){
    L->data[i]=L->data[i+1]; /* 移动元素 */
  }
  L->Length--; /* 修改表长 */
  
  return 1; /* 删除成功 */
}

 时间复杂度O(n),(n+1)/2

5. 查找元素

在顺序表中查找元素时,从第一个元素开始依次与元素x比较,直到与找到一个与x相等的数据元素,返回他在顺序表中的存储下标,如果没有找到,则返回-1。

int ListSerach(SeqList *L,int x){
  int i=0;
  while (i<L->Length && L->data[i]!=x){
    i++;
  }
  if (i>L->Length-1) return -1;  /* 查找失败,返回-1 */
  else return i;          /* 查找成功返回所在位置 */
}

 时间复杂度:O(n),(n+1)/2。

完整代码:

#include "stdio.h"
#include <stdlib.h>
#define MAX 20

typedef struct LNode{
  int data[MAX];
  int Length;
}SeqList;
int arr[]={1,5,6,3,9,7};/* 定义一个要输入的数组 */

/* 初始化顺序表 */
SeqList *ListCreat(){
  SeqList *L;
  L=(SeqList *)malloc(sizeof(SeqList));
  for (int i = 0; i < sizeof(arr)/4; i++){ /* 向data填入arr中的数据 */
    L->data[i] = arr[i];
  }
  L->Length=sizeof(arr)/4;
  return L;
}

/* 插入元素 */
int ListInsert(SeqList *L, int pos, int ele){
  if(pos>L->Length+1 || pos<1){
    printf("位置错");
    return -1; /* 检查插入位置正确性 */
  }
  if(L->Length == MAX){  /* 表满 */
    printf("表满");
    return 0;
  }
  for (int i = L->Length-1; i > pos-2; i--){
    L->data[i+1]=L->data[i]; /* 节点移动 */
  }
  L->data[pos-1] = ele; /* 新元素插入 */
  L->Length++; /* 表长+1 */

  return 1; /* 插入成功返回1 */
}

/* 删除指定位置元素 */
int ListDel(SeqList *L,int pos){
  if(pos>L->Length || pos<1){ /* 检查删除位置合法性 */
    printf("无法删除第%d个元素",pos);
    return 0;
  }
  for(int i=pos-1; i < L->Length; i++){
    L->data[i]=L->data[i+1]; /* 移动元素 */
  }
  L->Length--; /* 修改表长 */

  return 1; /* 删除成功 */
}

/* 查找元素 */
int ListSerach(SeqList *L,int x){
  int i=0;
  while (i<L->Length && L->data[i]!=x){
    i++;
  }
  if (i>L->Length-1) return -1;  /* 查找失败,返回-1 */
  else return i;          /* 查找成功返回所在位置 */
}

/* 显示链表 */
void displayList(SeqList *L){
  printf("\nL的内容:");
  for (int i = 0; i < L->Length; i++)
  {
    printf("%d ",L->data[i]);
  }
  printf("\n");
}

int main(){
  int i,e;
  SeqList *L = ListCreat();
  displayList(L);

  printf("请输入插入的位置:");
  scanf("%d",&i);
  printf("请输入插入的数据:");
  scanf("%d",&e);
  ListInsert(L,i,e);
  displayList(L);

  printf("要查找的元素");
  scanf("%d",&e);
  i = ListSerach(L,e)+1;
  printf("元素%d的位置是%d\n",e,i);

  printf("请输入删除的位置:");
  scanf("%d",&i);
  ListDel(L,i);
  displayList(L);
}
点这里查看完整代码

 

posted @ 2021-10-26 15:06  automated  阅读(228)  评论(0)    收藏  举报