1. 程式人生 > 資訊 >谷歌 Chrome 95 桌面端瀏覽器穩定版釋出:加入安全支付等新功能

谷歌 Chrome 95 桌面端瀏覽器穩定版釋出:加入安全支付等新功能

線性表的順序儲存是指,在記憶體中用地址連續的一塊儲存空間,順序存放線性表的各元素,用這種儲存形式儲存的線性表成為順序表

順序表的基本操作

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);
}
點這裡檢視完整程式碼