数据结构与算法复习总结(一)
写在前面
马上要期末考试了,我的数据结构呀!整个学期一直被数据结构与算法支配着,每天忙着老师布置的题,刷题,写预习卡(想打人.jpg),做实验,做小组作业。嗯…还不知道自己到底学了什么,好像被这种束缚和安排抑制了我对数据结构与算法的学习兴趣,但我又深知它非常重要,所以我要好好复习啦~
一、数据结构与算法基本介绍
我用一个思维导图概括了
我每复习完一个章节,我都会习惯性的做一个思维导图,方便下次回顾和了解整个章节的大致内容。
小伙伴们好好看,可以跟着我一起复习或者学习的啦~
二、线性表
1. 首先,上图
2. 在这里,我还要实现一下顺序表的基本操作(查找,插入,删除等)
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#define MAXSIZE 100
using namespace std;
//顺序表的存储结构
typedef int ElemType;
typedef struct{
ElemType *elem;
int length;
}SqList;
//C语言中&表示的不是引用,而是取地址符
//解决方法1.用指针来取代引用,在主函数中传进来地址;
//2.将代码扩展名保存成.cpp文件
void InitList(SqList &L);
int LocateElem(SqList &L, ElemType e);
void ListInsert(SqList &L, int i, ElemType e);
void ListDelete(SqList &L, int i);
void PrintList(SqList &L);
void Insert(SqList &L);
void Delete(SqList &L);
void Locate(SqList &L);
//顺序表初始化
void InitList(SqList &L){
L.elem = new ElemType[MAXSIZE];
if(!L.elem)
return;
L.length=0;
}
//顺序表查找
int LocateElem(SqList &L, ElemType e){
int i;
for(i=0;i<L.length;i++){
if(L.elem[i] == e)
return i+1;
}
return 0;
}
//顺序表插入
void ListInsert(SqList &L, int i, ElemType e){
int j;
if(i<1 || i>L.length+1 || L.length == MAXSIZE)
return;
for(j=L.length-1;j>i-1;j--){
L.elem[j+1] = L.elem[j];
}
L.elem[i-1] = e;
L.length++;
}
//顺序表删除
void ListDelete(SqList &L, int i){
int j;
if(i<1 || i>L.length)
return;
for(j=i;j<L.length;j++){
L.elem[j-1] = L.elem[j];
}
L.length--;
}
//输出
void PrintList(SqList &L){
int i;
for(i=0;i<L.length;i++){
printf("%d ",L.elem[i]);
}
printf("\n");
}
//插入功能函数,调用 LocateElem()
void Locate(SqList &L){
ElemType e;
int flag;
printf("请输入要查找的元素值:\n");
scanf("%d",&e);
flag=LocateElem(L,e);
flag = LocateElem(L, e);
if (flag!=0)
{
printf("该元素位置为:%d\n", flag);
}
else
printf("未找到该元素!\n");
}
//插入功能函数,调用 ListInsert()
void Insert(SqList &L){
int place;
ElemType e;
printf("请输入要插入的位置及元素:\n");
scanf("%d %d",&place,&e);
ListInsert(L,place,e);
PrintList(L);
}
//插入功能函数,调用 ListDelete()
void Delete(SqList &L){
int place;
printf("请输入要删除的位置:\n");
scanf("%d",&place);
ListDelete(L,place);
PrintList(L);
}
void menu(){
printf("****************菜单******************\n");
printf("0.退出页面\n");
printf("1.插入元素\n");
printf("2.查找元素\n");
printf("3.删除元素\n");
printf("4.输出线性表\n");
}
int main(){
int choice;
SqList L;
InitList(L);
menu();
printf("当前顺序表为空,请先执行插入元素操作序号\n");
while(1){
printf("请输入菜单序号:");
scanf("%d",&choice);
switch(choice){
case 0:return 0;
case 1:{
Insert(L);
break;
}
case 2:{
Locate(L);
break;
}
case 3:{
Delete(L);
break;
}
case 4:{
PrintList(L);
break;
}
default:printf("输入错误!\n");
}
}
return 0;
}
附上操作结果截图如下:
3.顺序表和链表的比较
- 空间性能比较
(1)存储空间分配
顺序表的存储空间必须分配,易造成存储空间浪费或者空间溢出现象;而链表不需要为其预先分配空间,只要内存空间允许,链表中的元素个数就没有限制;
(2)存储密度大小
顺序表存储密度为1,而链表的存储密度小于1,存储密度越大,存储空间的利用率就越高。 - 时间性能比较
(1)存储元素效率
顺序表示一种随机存储结构,取值的算法时间复杂度为O(1);而链表是一种顺序存储结构,取值算法时间复杂度为O(n);
(2)插入和删除操作的效率
对于链表,在确定删除和插入的位置后,插入和删除无需移动数据,只需修改指针,时间复杂度为O(1);而顺序表时间复杂度为O(n),所以,对于需要进行频繁插入和删除操作的线性表,应该采用链表作为存储结构。
P.S. 我们使用的教材是严蔚敏的C语言版本。
这是我昨天学习总结的,我会持续更新的啦,还有单链表的基本操作和实现,小伙伴们可以自己试着实现,敲黑板!!一定要自己写代码,只看书不行的啦,到实际运用根本啥也不会,写不出可以跟着书一个算法一个算法的敲,多写几遍多看几遍就可可~