复习备考数据结构与算法(一)!!

数据结构与算法复习总结(一)

写在前面

马上要期末考试了,我的数据结构呀!整个学期一直被数据结构与算法支配着,每天忙着老师布置的题,刷题,写预习卡(想打人.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语言版本。
这是我昨天学习总结的,我会持续更新的啦,还有单链表的基本操作和实现,小伙伴们可以自己试着实现,敲黑板!!一定要自己写代码,只看书不行的啦,到实际运用根本啥也不会,写不出可以跟着书一个算法一个算法的敲,多写几遍多看几遍就可可~

佳佳加油!冲冲冲
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值