157 lines
3.5 KiB
Markdown
157 lines
3.5 KiB
Markdown
### 顺序表
|
||
|
||
```c
|
||
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
#include <string.h>
|
||
#include <time.h>
|
||
#include <math.h>
|
||
#include <Windows.h>
|
||
/*
|
||
顺序表 连续存储的动态数组
|
||
链表 分散存储的动态数组
|
||
栈 后进先出的数组
|
||
队列 先进先出的数组
|
||
*/
|
||
//顺序表
|
||
typedef struct List{
|
||
int *arr;//用来存储数据首地址
|
||
int size;//用来存储当前已经插入的元素个数
|
||
int capacity;//用来存储最大的容量
|
||
}List;
|
||
//函数声明
|
||
//对顺序表进行初始化
|
||
void init(List *list, int n){
|
||
//对List结构体中arr指针变量 指向一块动态内存分配的地址
|
||
list->arr = (int *)malloc(sizeof(int)*n);
|
||
//malloc 用来分配指定大小的内存空间并返回 void*类型的首地址
|
||
list->size = 0;//设置当前元素个数为0
|
||
list->capacity = n;//设置当前数组容量为n
|
||
memset(list->arr, 0, sizeof(int)*n);
|
||
//memset对指定内存空间 设置初始值为0
|
||
}
|
||
|
||
|
||
//传入list结构体指针 并对其中
|
||
void enlargeList(List *list){
|
||
//对数组元素进行扩容 数组起始地址 扩大后的内存大小
|
||
list->arr = (int *)realloc(list->arr, sizeof(int)*list->capacity*2);
|
||
//对扩容后的空间进行初始化赋值给0
|
||
memset(list->arr + list->capacity, 0, list->capacity*sizeof(int));
|
||
//容量扩大一倍
|
||
list->capacity *= 2;
|
||
}
|
||
|
||
//在顺序表最后面插值
|
||
void add(List *list, int num){
|
||
//对数组最后一个位置进行赋值
|
||
//当前数组元素个数应小于当前容量
|
||
if(list->size == list->capacity){
|
||
enlargeList(list);
|
||
}
|
||
*(list->arr + list->size) = num;
|
||
list->size++;//元素个数加一
|
||
}
|
||
|
||
//遍历数组中元素并打印
|
||
void traverse(List *list){
|
||
int i;
|
||
for(i=0;i<list->size;i++){
|
||
|
||
printf("%2d ", *(list->arr + i));
|
||
if((i+1)%10==0){
|
||
printf("\n",(i+1));
|
||
//Sleep(1000);
|
||
}
|
||
}
|
||
printf("\n");
|
||
}
|
||
|
||
int getRandNum(int startNum, int endNum){
|
||
|
||
return rand()%(endNum - startNum) + startNum;
|
||
//计算出start~end之间的随机整数并包括start和end
|
||
}
|
||
|
||
//在指定位置插值
|
||
void addByIndex(List *list, int num, int n){
|
||
int i;
|
||
if(list->size == list->capacity){
|
||
enlargeList(list);
|
||
}
|
||
//将这个位置-1开始的所有元素整体往后挪动一个位置
|
||
for(i=list->size-1;i>=n-1;i--){
|
||
*(list->arr+i+1) = *(list->arr+i);
|
||
}
|
||
*(list->arr+n-1) = num;
|
||
list->size++;//元素个数+1
|
||
}
|
||
|
||
//删除指定位置元素并返回该元素
|
||
int deleteByIndex(List *list, int n){
|
||
int i;
|
||
//从删除位置n-1开始 元素整体前移,覆盖掉n-1位置需要删除的元素
|
||
for(i=n-1;i<list->size-1;i++){
|
||
*(list->arr + i) = *(list->arr + i + 1);
|
||
}
|
||
*(list->arr + list->size - 1) = 0;
|
||
list->size--;
|
||
}
|
||
|
||
//判断顺序表是否为空
|
||
//size为0则返回1 代表数组是空的
|
||
int isEmpty(List *list){
|
||
return list->size?0:1;
|
||
}
|
||
|
||
//判断顺序表是否已满
|
||
//size==capacity 为真
|
||
int isFull(List *list){
|
||
return list->size == list->capacity?1:0;
|
||
}
|
||
|
||
//获取顺序表中的元素个数
|
||
int size(List *list){
|
||
return list->size;
|
||
}
|
||
|
||
//对顺序表中元素进行升序排序
|
||
void sort(List *list){
|
||
int i, j, temp;
|
||
for(i=0;i<list->size-1;i++){
|
||
for(j=0;j<list->size-1-i;j++){
|
||
if(list->arr[j] > list->arr[j+1]){
|
||
temp = list->arr[j];
|
||
list->arr[j] = list->arr[j+1];
|
||
list->arr[j+1] = temp;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
int main(void){
|
||
List list;//定义结构体变量
|
||
List *p = &list;
|
||
int i;
|
||
|
||
system("color f4");
|
||
srand((unsigned)time(NULL));//以当前时间为随机数种子
|
||
init(p, 1);//顺序表的初始化
|
||
|
||
add(p, 1);
|
||
add(p, 2);
|
||
add(p, 3);
|
||
addByIndex(p, 66, 2);
|
||
addByIndex(p, 100, 1);
|
||
deleteByIndex(p, 3);
|
||
sort(p);
|
||
traverse(p);
|
||
|
||
|
||
|
||
return 0;
|
||
}
|
||
```
|
||
|