C初级_顺序表
程序员文章站
2024-03-20 14:16:52
...
1.数据结构
1.1存储和组织数据的方式
1.2算法对数据进行处理–>四大基本操作(增 删 查 改)
1.3不同的数据结构具有不同的操作方式,需要选择合适的数据结构,提升代码的效率
1.4根据数据之间的逻辑结构将数据分为以下几种关系:
集合:数据与数据之间无明显关系
线性关系:每个数据有唯一的前驱和后继
树状结构:一对多
图:多对
1.5数据间的存储结构
顺序存储:存放元素的位置相邻
链式存储:元素间位置不相邻,但是可以通过上一个元素找到下一个数据
2.线性关系
顺序表:顺序存储的线性表
链表/双链表
栈和队列
3.本次课内容——顺序表
(对数组的操作)
增
删
改
查
查找如果是有序数组,那么可以通过多种方法进行查找,如果是无序的则只能一个一个查找
4.代码实例
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
typedef struct list
{
int arr[100];
int len;//管理当前存放数据的个数
int size;//用于管理动态数组的大小
}LIST;
//顺序表初始化,对顺序表进行操作
void init(LIST *p);
//实现插入功能的函数
void insertData(LIST*p,int data);
//实现删除一个数字功能的函数
void deleData(LIST *p, int data);
//实现删除所有重复数字功能的函数
void deleData1(LIST *p, int data);
//实现查找功能
void findData(LIST *p, int data);
int main()
{
printf("以下输出用来说明对一组数插入一个数的工程:\n");
LIST mylist1;//准备一个顺序表
init(&mylist1);
srand((unsigned)time(NULL));
for (int i = 0; i < 80; ++i)
{
insertData(&mylist1, rand() % 200);
}//赋值
for (int i = 0; i < mylist1.len; ++i)
{
printf("%-4d", mylist1.arr[i]);
}//输出
printf("\n\n以下输出用来说明对一组数进行删除数字10的操作:\n");
LIST mylist2;//准备一个顺序表
init(&mylist2);
for (int i = 0; i < 80; ++i)
{
insertData(&mylist2, i);
}
printf("原始数组内容为:\n");
for (int i = 0; i < mylist2.len; ++i)
{
//if (i % 7 == 0)printf("\n");
printf("%-4d", mylist2.arr[i]);
}
deleData(&mylist2, 10);
printf("\n删除数字10 之后的数组为:\n");
for (int i = 0; i < mylist2.len; ++i)
{
//if (i % 7 == 0)printf("\n");
printf("%-4d", mylist2.arr[i]);
}
printf("\n\n以下输出用来说明对一组数进行删除重复数字10的操作:\n");
LIST mylist3;//准备一个顺序表
init(&mylist3);
for (int i = 0; i < 80; ++i)
{
insertData(&mylist3, i/7);
}
printf("原始数组内容为:\n");
for (int i = 0; i < mylist3.len; ++i)
{
if (i % 7 == 0)printf("\n");
//if (i % 7 == 0)printf("\n");
printf("%-4d", mylist3.arr[i]);
}
deleData1(&mylist3, 10);
printf("\n删除数字10 之后的数组为:\n");
for (int i = 0; i < mylist3.len; ++i)
{
if (i % 7 == 0)printf("\n");
//if (i % 7 == 0)printf("\n");
printf("%-4d", mylist3.arr[i]);
}
printf("\n\n以下内容用来查找值为3在这个数组中是否存在:\n");
//查找mylist3中数字为3的值
findData(&mylist3, 3);
getchar();
return 0;
}
void init(LIST *p)
{
p->len = 0;
p->size = 100;
}
void insertData(LIST*p,int data)
{
#if 0
//插入方式:头插、尾插、中间插入
if ( p->len == p->size) return;//防止数组越界
p->arr[p->len] =data ;
p->len++;//len管理插入数据的个数 插入一个数据 len就++一次
#else//其它插入方式
if (p->len == p->size) return;
int i = p->len;
while (i - i >= 0 && p->arr[i - 1] > data)
{
p->arr[i] = p->arr[i - 1];
--i;
}
p->arr[i] = data;
p->len++;
#endif
}
//删除元素不是正常想象的直接删除,而是将要删除元素的位置用后面元素替代
void deleData(LIST *p, int data)
{
//删除一个数据
for (int i = 0; i < p->len; ++i)
{
if (p->arr[i] == data)//找到要删除元素的下标
{
for (int j = i; j < p->len-1; ++j)//实现元素删除
{
p->arr[j] = p->arr[j+1];//j+1<len
}
p->len--;//删除之后元素个数-1
break;
}
}
}
//用于删除全部的重复数字
void deleData1(LIST *p, int data)
{
//删除一个数据
for (int i = 0; i < p->len; ++i)
{
if (p->arr[i] == data)//找到要删除元素的下标
{
for (int j = i; j < p->len - 1; ++j)//实现元素删除
{
p->arr[j] = p->arr[j + 1];//j+1<len
}
p->len--;//删除之后元素个数-1
--i;
//break;
}
}
}
//用于查找该数组中数字为3的值
void findData(LIST *p, int data)
{
for (int i = 0; i < p->len; ++i)
{
if (p->arr[i] == data)
{
printf("arr[%d]=%d\t",i,p->arr[i]);//数据少用数据结构,数据多用数据库
}
}
}
上一篇: Servlet Cookie