1. 程式人生 > >C++學習(二十九)(C語言部分)之 順序表

C++學習(二十九)(C語言部分)之 順序表

include 刪除 chan 筆記 管理數據 每一個 選擇 middle cmp

一、數據結構
組織 存放數據的方式
精心選擇的數據結構可以提升效率
數據結構 1、邏輯結構
一對多關系 父與子
一對一關系 排隊中
多對多關系 兩地的路線
2、存儲結構
數據存放的位置關系
順序存儲數據 一個挨著一個的存儲(數組)
鏈式存儲方式

二、線性表
邏輯方面是線性關系 一對一線性 每一個元素有唯一的前驅和後繼
順序存儲的線性表 就是順序表
鏈式存儲的線性表 就是鏈表

三、順序表
主要實現方式---->數組/動態數組
順序存儲的線型表
數據結構--->為了管理數據
對數據進行操作--->增加 刪除 查找 修改

附:
靜態數組(定義的大小固定)
數組已滿 就不能存放數據
動態數組
數組滿 --->分配新的內存(申請更大的空間存儲數據)
實現 用malloc申請內存

測試代碼筆記如下:

  1 #include<stdio.h>
  2 struct LIST  //定義結構體
  3 {
  4     int arr[20];  //存放數據的數組
  5     int size;  //數組中最多能夠存多少元素
  6     int len;  //數組中已經存了多少元素
  7 };
  8 
  9 //初始化函數
 10 void main(struct
LIST*p) 11 { 12 //剛開始表中沒有數據 13 p->len = 0; 14 p->size = 20; //最多可以存的數據 15 } 16 17 //增加數據 18 void insert(struct LIST*p,int data) 19 { 20 //直接插入末尾 21 if (p->len < p->size) //說明順序表沒有滿 22 { 23 p->arr[p->len] = data; //根據數組的下標判斷 len知道的是最後一個元素的下一個位置
24 p->len++; 25 //兩行等價於p->arr[p->len++]=data; 26 } 27 } 28 29 //插入到中間 插入到前面 30 void instert_middle(struct LIST*p, int data, int index) //index是下標 插入到下標所在位置 31 { 32 if (p->len < p->size) //說明順序表沒有滿 33 { 34 if (index >= 0 && index < p->len) 35 { 36 //可以先插入到這個位置 37 //先騰出一個位置 38 for (int i = p->len; i>index; --i) 39 { 40 p->arr[i] = p->arr[i - 1]; //元素往後移動 41 } 42 p->arr[index] = data; //插入到這個位置 43 p->len++; //插入了一個元素 所以讓它加1 44 } 45 else 46 { 47 p->arr[p->len++] = data; //否則插入尾部 48 } 49 } 50 } 51 52 //查找 一個一個找 53 int search(struct LIST*p, int data) 54 { 55 for (int i = 0; i < p->len; ++i) 56 { 57 if (data == p->arr[i]) 58 { 59 return i; //找到了return下標 60 } 61 } 62 return -1; //不存在這個位置 63 } 64 65 //修改數據 66 void change(struct LIST*p,int data,int newData) 67 { 68 //根據學生的名字查找 69 for (int i = 0; i < p->len; ++i) 70 { 71 if (data == p->arr[i]); //找到了就修改 72 { 73 p->arr[i] = newData; //學生名字 字符數組 比較用什麽 strcmp string.h 74 break; //如果有多個相同數據都要修改 去掉break 75 } 76 } 77 } 78 79 //刪除數據 刪除就是覆蓋 循環 80 void dele(struct LIST*p, int data) 81 { 82 for (int i = 0; i < p -> len; ++i) 83 { 84 if (data == p->arr[i]) //找到位置 開始刪除 85 { 86 for (int j = i; j < p->len-1; ++j) //從前往後 87 { 88 p->arr[j] = p->arr[j + 1]; 89 } 90 p->len--; 91 break; 92 } 93 } 94 } 95 96 int main() 97 { 98 #if 0 99 int x, y, z; 100 int k; 101 printf("%p,%p,%p,%p", &x, &y, &z, &k); 102 #endif 103 104 #if 1 105 /* 106 示例: 107 存放同學的信息 學號+姓名 108 一個班級100個同學 +插班生 +轉班生 109 150--70 110 字符數組 字符串 111 char arr[100]="hello world";//數組大小 數組有效元素11個字符 112 \0 前面是有效數據 後面是無效數據 這個只限於字符數組 113 順序表中 1.有多少個數據 2.可以放多少個數據 114 int brr[100]={1,2,34}; 115 //有3個數據 最多可以放100個數據 116 117 默認不考慮數據重復問題 118 */ 119 struct LIST list; //定義一個順序表 120 init(&list); //調用函數初始化 121 insert(&list, 2); 122 instert_middle(&list, 3, 4); //插入的數據是3 插到下標為4的位置 123 #endif 124 getchar(); 125 return 0; 126 }

2019-03-30 09:17:07

C++學習(二十九)(C語言部分)之 順序表