3.5 KiB
3.5 KiB
顺序表
#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;
}