最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言實(shí)現(xiàn)的順序表功能完整實(shí)例

 更新時(shí)間:2018年04月30日 13:24:39   作者:Tom文星  
這篇文章主要介紹了C語言實(shí)現(xiàn)的順序表功能,結(jié)合完整實(shí)例形式分析了C語言順序表的創(chuàng)建、添加、刪除、排序、合并等相關(guān)操作技巧,需要的朋友可以參考下

本文實(shí)例講述了C語言實(shí)現(xiàn)的順序表功能。分享給大家供大家參考,具體如下:

seqlist.h

#ifndef __SEQLIST_H__
#define __SEQLIST_H__
#include<cstdio>
#include<malloc.h>
#include<assert.h>
#define SEQLIST_INIT_SIZE 8
#define INC_SIZE 3 //空間增量的大小
typedef int ElemType;
typedef struct Seqlist {
  ElemType *base;
  int capacity; //順序表容量
  int size; //表的大小
}Seqlist;
bool Inc(Seqlist *list);//增加順序表的容量
void InitSeqlist(Seqlist *list); //初始化順序表
void push_back(Seqlist *list, ElemType x); //在順序表的末尾插入元素
void push_front(Seqlist *list, ElemType x); //在順序表的頭部插入元素
void show_list(Seqlist *list); //顯示順序表中的元素
void pop_back(Seqlist *list); //刪除順序表最后一個(gè)元素
void pop_front(Seqlist *list); //刪除順序表第一個(gè)元素
void insert_pos(Seqlist *list, int pos, ElemType x);//在順序表的選定位置上插入數(shù)據(jù)
int find(Seqlist *list, ElemType key); //在順序表中查找元素key的下標(biāo)
int length(Seqlist *list);//求順序表的長度
void delete_pos(Seqlist *list, int pos); //刪除順序表中特定位置的數(shù)據(jù)元素
void delete_val(Seqlist *list, int key);//刪除順序表中值為key的數(shù)據(jù)元素
void sort(Seqlist *list);//冒泡排序
void reverse(Seqlist *list);//逆置順序列表
void clear(Seqlist *list);//清除順序表中的所有元素
void destroy(Seqlist *list);//摧毀順序表
void merge(Seqlist *lt, Seqlist *la, Seqlist *lb);//合并兩個(gè)順序列表
#endif //__SEQLIST_H__

seqlist.cpp

#include"seqlist.h"
bool Inc(Seqlist *list) {
  ElemType *newbase = (ElemType*)realloc(list, sizeof(ElemType)*(list->capacity + INC_SIZE)); //重新分配內(nèi)存空間
  if (newbase == NULL) {
    printf("內(nèi)存空間已滿,無法再分配內(nèi)存空間!\n");
    return false;
  }
  list->base = newbase;
  list->capacity += INC_SIZE;
  return true;
}
void InitSeqlist(Seqlist *list) {
  list->base = (ElemType*)malloc(sizeof(ElemType)*SEQLIST_INIT_SIZE);
  assert(list->base != NULL);
  list->capacity = SEQLIST_INIT_SIZE;
  list->size = 0;
}
void push_back(Seqlist *list, ElemType x) {
  if (list->size >= list->capacity && !Inc(list)) { //Inc(list)用來判斷增加順序表容量是否成功,只有在失敗的情況下才會(huì)進(jìn)入if語句中
    printf("順序表容量已滿,無法再在表尾繼續(xù)插入新元素!\n");
    return;
  }
  list->base[list->size] = x;
  list->size++;
}
void push_front(Seqlist *list, ElemType x) {
  if (list->size >= list->capacity && !Inc(list)) {
    printf("順序表容量已滿,無法再在表頭插入新元素!\n");
    return;
  }
  for (int i = list->size;i > 0;i--) {
    list->base[i] = list->base[i - 1];
  }
  list->base[0] = x;
  list->size++;
}
void show_list(Seqlist *list) {
  for (int i = 0;i < list->size;i++) {
    printf("%d ", list->base[i]);
  }
  printf("\n");
}
void pop_back(Seqlist *list) {
  if (list->size == 0) {
    printf("順序表已空,無法再在表尾刪除元素!\n");
    return;
  }
  list->size--;
}
void pop_front(Seqlist *list) {
  if (list->size == 0) {
    printf("順序表已空,無法再在表頭刪除元素!\n");
    return;
  }
  for (int i = 0;i < list->size - 1;i++) {
    list->base[i] = list->base[i + 1];
  }
  list->size--;
}
void insert_pos(Seqlist *list, int pos, ElemType x) {
  if (pos<0 || pos>list->size) {
    printf("插入位置不合法,無法插入元素!\n");
    return;
  }
  if (list->size >= list->capacity && !Inc(list)) {
    printf("順序表容量已滿,無法在插入新的元素!\n");
    return;
  }
  for (int i = list->size;i > pos;i--) {
    list->base[i] = list->base[i - 1];
  }
  list->base[pos] = x;
  list->size++;
}
int find(Seqlist *list, ElemType key) {
  for (int i = 0;i < list->size;i++) {
    if (list->base[i] == key)
      return i;
  }
  return -1;
}
int length(Seqlist *list) {
  return list->size;
}
void delete_pos(Seqlist *list, int pos) {
  if (pos < 0 || pos >= list->size) {
    printf("刪除位置不合法,無法刪除元素!\n");
    return;
  }
  for (int i = pos;i < list->size - 1;i++) {
    list->base[i] = list->base[i + 1];
  }
  list->size--;
}
void delete_val(Seqlist *list, int key) {
  int pos = find(list, key);
  if (pos == -1) {
    printf("順序表中沒有這個(gè)元素!\n");
    return;
  }
  delete_pos(list, pos);
}
void sort(Seqlist *list) {
  for (int i = 0;i < list->size - 1;i++) {//排序的趟數(shù)(例如5個(gè)數(shù)據(jù)需要比較4趟)
    for (int j = 0;j < list->size - 1 - i;j++) {//每一趟比較中的比較次數(shù)(例如5個(gè)數(shù)據(jù)在第0趟需要比較4次)
      if (list->base[j] > list->base[j + 1]) {
        ElemType temp = list->base[j];
        list->base[j] = list->base[j + 1];
        list->base[j + 1] = temp;
      }
    }
  }
}
void reverse(Seqlist *list) {
  if (list->size == 0 || list->size == 1) return;
  int low = 0, high = list->size - 1;
  while (low < high) {
    ElemType temp = list->base[low];
    list->base[low] = list->base[high];
    list->base[high] = temp;
    low++;
    high--;
  }
}
void clear(Seqlist *list) {
  list->size = 0;
}
void destroy(Seqlist *list) {
  free(list->base);
  list->base = NULL;
  list->capacity = 0;
  list->size = 0;
}
void merge(Seqlist *lt, Seqlist *la, Seqlist *lb) {
  lt->capacity = la->size + lb->size;
  lt->base = (ElemType*)malloc(sizeof(ElemType)*lt->capacity);
  assert(lt->base != NULL);
  int ia = 0, ib = 0, ic = 0;
  while (ia < la->size&&ib < lb->size) {
    if (la->base[ia] < lb->base[ib]) {
      lt->base[ic++] = la->base[ia++];
    }
    else {
      lt->base[ic++] = lb->base[ib++];
    }
  }
  while (ia < la->size) {
    lt->base[ic++] = la->base[ia++];
  }
  while (ib < lb->size) {
    lt->base[ic++] = lb->base[ib++];
  }
  lt->size = la->size + lb->size;
  show_list(lt);
}

main.cpp

#include"seqlist.h"
void main() {
  Seqlist list;
  InitSeqlist(&list);
  ElemType item;
  int pos;
  int select = 1;
  while (select) {
    printf("*******************************************\n");
    printf("*[1] push_back    [2] push_front  *\n");
    printf("*[3] show_list    [4] pop_back   *\n");
    printf("*[5] pop_front    [6] insert_pos  *\n");
    printf("*[7] find       [8] length    *\n");
    printf("*[9] delete_pos    [10] delete_value *\n");
    printf("*[11] sort       [12] reverse    *\n");
    printf("*[13] clear      [14] merge     *\n");
    printf("*[0] quit_system             *\n");
    printf("*******************************************\n");
    printf("請選擇:>>");
    scanf("%d", &select);
    if (select == 0) break;
    switch (select) {
    case 1:
      printf("請輸入要插入的數(shù)據(jù)(-1結(jié)束):>");
      while (scanf("%d", &item), item != -1) {//先輸入item的值,只要item不等于-1就接著循環(huán)
        push_back(&list, item);
      }
      break;
    case 2:
      printf("請輸入要插入的數(shù)據(jù)(-1結(jié)束):>");
      while (scanf("%d", &item), item != -1) {
        push_front(&list, item);
      }
      break;
    case 3:
      show_list(&list);
      break;
    case 4:
      pop_back(&list);
      break;
    case 5:
      pop_front(&list);
      break;
    case 6:
      printf("請輸入要插入的數(shù)據(jù):>");
      scanf("%d", &item);
      printf("請輸入要插入的位置:>");
      scanf("%d", &pos);
      insert_pos(&list, pos, item);
      break;
    case 7:
      printf("請輸入要查找的數(shù)據(jù):>");
      scanf("%d", &item);
      pos = find(&list, item);
      if (pos == -1)
        printf("查找的數(shù)據(jù)元素不在順序表中!\n");
      else
        printf("查找的數(shù)據(jù)元素在順序表中的下標(biāo)位置為%d\n", pos);
      break;
    case 8:
      printf("順序表的長度為%d\n", length(&list));
      break;
    case 9:
      printf("請輸入要?jiǎng)h除數(shù)據(jù)在順序表中的下標(biāo)位置:>");
      scanf("%d", &pos);
      delete_pos(&list, pos);
      break;
    case 10:
      printf("請輸入要?jiǎng)h除數(shù)據(jù)的值:>");
      scanf("%d", &item);
      delete_val(&list, item);
      break;
    case 11:
      sort(&list);
      break;
    case 12:
      reverse(&list);
      break;
    case 13:
      clear(&list);
      break;
    case 14:
      Seqlist mylist, yourlist;
      ElemType item1, item2;
      InitSeqlist(&mylist);
      InitSeqlist(&yourlist);
      printf("請輸入順序表1中的元素值(-1結(jié)束):>");
      while (scanf("%d", &item1), item1 != -1) {
        push_back(&mylist, item1);
      }
      printf("請輸入順序表2中的元素值(-1結(jié)束):>");
      while (scanf("%d", &item2), item2 != -1) {
        push_back(&yourlist, item2);
      }
      merge(&list, &mylist, &yourlist);
      destroy(&mylist);
      destroy(&yourlist);
      break;
    default:
      printf("輸入的選擇錯(cuò)誤!請重新輸入!\n");
      break;
    }
  }
  destroy(&list);
}

希望本文所述對大家C語言程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Qt串口通信開發(fā)之Qt串口通信模塊QSerialPort開發(fā)完整實(shí)例(串口助手開發(fā))

    Qt串口通信開發(fā)之Qt串口通信模塊QSerialPort開發(fā)完整實(shí)例(串口助手開發(fā))

    這篇文章主要介紹了Qt串口通信開發(fā)之Qt串口通信模塊QSerialPort開發(fā)完整實(shí)例(串口助手開發(fā)),需要的朋友可以參考下
    2020-03-03
  • C語言報(bào)錯(cuò):Buffer Overflow的原因和解決辦法

    C語言報(bào)錯(cuò):Buffer Overflow的原因和解決辦法

    Buffer Overflow是C語言中常見且危險(xiǎn)的內(nèi)存錯(cuò)誤之一,它通常在程序試圖向緩沖區(qū)(如數(shù)組或內(nèi)存塊)寫入超過其容量的數(shù)據(jù)時(shí)發(fā)生,本文將詳細(xì)介紹Buffer Overflow的產(chǎn)生原因,提供多種解決方案,需要的朋友可以參考下
    2024-07-07
  • C++中int?main(int?argc,?char**?argv)的參數(shù)使用

    C++中int?main(int?argc,?char**?argv)的參數(shù)使用

    int?main(int?argc,?char**?argv)?是C和C++程序的入口點(diǎn),其中argc和argv是用來接收從命令行傳遞給程序的參數(shù)的,本文就來介紹一下這兩個(gè)參數(shù)的含義,感興趣的可以了解一下的相關(guān)資料
    2024-01-01
  • Qt控件之QPushButton使用及技巧

    Qt控件之QPushButton使用及技巧

    QPushButton類是Qt中用于創(chuàng)建按鈕的控件類,它繼承自QAbstractButton類,本文就來介紹一下Qt控件之QPushButton使用及技巧,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • 一文讀懂C++中的繼承之菱形繼承(案例分析)

    一文讀懂C++中的繼承之菱形繼承(案例分析)

    這篇文章主要介紹了C++中的繼承之菱形繼承的相關(guān)知識(shí),通過案例給大家詳細(xì)分析介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-04-04
  • Qt實(shí)現(xiàn)文本編輯器(二)

    Qt實(shí)現(xiàn)文本編輯器(二)

    這篇文章主要介紹了利用Qt實(shí)現(xiàn)的一個(gè)文本編輯器。本文將具體講解下是如何實(shí)現(xiàn)菜單欄以及工具欄上對應(yīng)的需求,感興趣的可以動(dòng)手試一試
    2022-01-01
  • Qt學(xué)習(xí)筆記之QPalette調(diào)色板類

    Qt學(xué)習(xí)筆記之QPalette調(diào)色板類

    這篇文章主要為大家詳細(xì)介紹了Qt學(xué)習(xí)筆記之QPalette調(diào)色板類,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • C語言中的多行輸入問題及說明

    C語言中的多行輸入問題及說明

    這篇文章主要介紹了C語言中的多行輸入問題及說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 詳解C語言整數(shù)和浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)

    詳解C語言整數(shù)和浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)

    這篇文章主要介紹了C語言整數(shù)和浮點(diǎn)數(shù)在內(nèi)存中是如何存儲(chǔ)的,文中有詳細(xì)的代碼示例供大家參考,對大家了解學(xué)習(xí)C語言整數(shù)和浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)有一定的幫助,需要的朋友可以參考下
    2024-03-03
  • C++實(shí)現(xiàn)獲取本機(jī)MAC地址與IP地址

    C++實(shí)現(xiàn)獲取本機(jī)MAC地址與IP地址

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)獲取本機(jī)MAC地址與IP地址的兩種方式,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-02-02

最新評(píng)論

巴青县| 六枝特区| 五原县| 循化| 清新县| 阿拉善左旗| 重庆市| 平度市| 延安市| 洞头县| 郧西县| 乐都县| 琼中| 阿城市| 诸城市| 陆丰市| 大新县| 三原县| 金秀| 喀什市| 高台县| 昌江| 全州县| 洞口县| 南安市| 乌审旗| 呼图壁县| 临颍县| 临江市| 阿勒泰市| 秭归县| 昔阳县| 富蕴县| 敦化市| 称多县| 鄂尔多斯市| 鄂伦春自治旗| 独山县| 中西区| 青冈县| 菏泽市|