一、基础内容
1.数据结构:相互之间存在一种或多种特定关系的数据元素的集合。
2.逻辑结构
(1)集合,所有数据在同一个集合中,关系平等。
(2)线性,数据和数据之间是一对一的关系
(3)树, 一对多
(4)图,多对多
3.物理结构(在内存当中的存储关系)
(1)顺序存储,数据存放在连续的存储单位中。逻辑关系和物理关系一致
(2)链式,数据存放的存储单位是随机或任意的,可以连续也可以不连续。
4.算法:是解决特定问题求解步骤的描述,计算机中表现为指令的有限序列,每条指令表示一个或多个操作。
5.算法的特征
1,输入,输出特性,输入时可选的,输出时必须的。
2,有穷性,执行的步骤会自动结束,不能是死循环,并且每一步是在可以接受的时间内完成。
3,确定性,同一个输入,会得到唯一的输出。
4,可行性,每一个步骤都是可以实现的。
6.算法的设计
(1)正确性,
1)语法正确
2)合法的输入能得到合理的结果。
3)对非法的输入,给出满足要求的规格说明
4)对精心选择,甚至刁难的测试都能正常运行,结果正确
(2)可读性,便于交流,阅读,理解
(3)健壮性,输入非法数据,能进行相应的处理,而不是产生异常
(4)高效,存储低,效率高
7.算法时间复杂度:也就是执行这个算法所花时间的度量
8.推导时间复杂度
(1)用常数1 取代运行时间中的所有加法常数
(2)在修改后的运行函数中,只保留最高阶项。
(3)如果最高阶存在且不是1,则取除这个项相乘的常数。
二、线性表
1.定义:零个或者多个数据元素的有限序列;
2.特征
(1)元素之间是有顺序了。如果存在多个元素,第一个元素无前驱,最有一个没有后继,其他的元素只有一个前驱和一个后继。
(2)当线性表元素的个数n(n>=0)定义为线性表的长度,当n=0时,为空表。在非空的表中每个元素都有一个确定的位置,如果a1是第一个元素,那么an就是第n个元素。
3.线性表的常规操作 ADT
typedef struct person {
char name[32];
char sex;
int age;
int score;
}DATATYPE;
typedef int Datatype;
typedef struct list {
DATATYPE *head;
int tlen;
int clen;
}SeqList;
SeqList *CreateSeqList(int len);
int DestroySeqList(SeqList *list);
int ShowSeqList(SeqList *list);
int InsertTailSeqList(SeqList *list, DATATYPE data);
int IsFullSeqList(SeqList *list);
int IsEmptySeqList(SeqList *list);
int InsertPosSeqList(SeqList *list, DATATYPE data, int pos);
int FindSeqList(SeqList *list, char *name);
int ModifySeqList(SeqList *list, char *old, DATATYPE new);
int DeleteSeqList(SeqList *list, char *name);
int ClearSeqList(SeqList *list);
4.手撕上述代码
(1)seqlist.h
#ifndef _SEQLIST_H_
#define _SEQLIST_H_
typedef struct person {
char name[32];
char sex;
int age;
int score;
}DATATYPE;
typedef struct list {
DATATYPE *head;
int tlen;
int clen;
}SeqList;
SeqList *CreateSeqList(int len);
int DestroySeqList(SeqList *list);
int ShowSeqList(SeqList *list);
int InsertTailSeqList(SeqList *list, DATATYPE* data);
int IsFullSeqList(SeqList *list);
int IsEmptySeqList(SeqList *list);
int InsertPosSeqList(SeqList *list, DATATYPE *data, int pos);
int FindSeqList(SeqList *list, char *name);
int ModifySeqList(SeqList *list, char *old, DATATYPE *newdata);
int DeleteSeqList(SeqList *list, char *name);
int ClearSeqList(SeqList *list);
int GetSizeSeqList(SeqList *list);
DATATYPE * GetItemSeqList(SeqList*list,int ind);
#endif // !1
(2)seqlist.c
#include "seqlist.h"
#include
#include
#include
SeqList *CreateSeqList(int len)
{
SeqList *sl = malloc(sizeof(SeqList));
if(NULL == sl)
{
fprintf(stderr,"CreateSeqList malloc error\n");
return NULL;
}
sl->head = malloc(sizeof(DATATYPE)*len);
if(NULL == sl->head)
{
fprintf(stderr,"CreateSeqList malloc2 error\n");
return NULL;
}
sl ->tlen = len;
sl ->clen = 0;
return sl;
}
int IsFullSeqList(SeqList *list)
{
if(NULL == list)
{
fprintf(stderr,"IsFullSeqList paramter erro\n");
return 1;
}
return list->clen == list->tlen;
}
int InsertTailSeqList(SeqList *list, DATATYPE *data)
{
if(IsFullSeqList(list))
{
fprintf(stderr,"seqlist full\n");
return 1;
}
memcpy(&list->head[list->clen],data,sizeof(DATATYPE));
list->clen++;
return 0;
//list->head[list -> clen]= *data;
}
int ShowSeqList(SeqList *list)
{
int len = GetSizeSeqList(list);
int i;
for(i = 0;ihead[i].name,list->head[i].sex,list->head[i].age,list->head[i].score);
}
}
int GetSizeSeqList(SeqList *list)
{
return list->clen;
}
int IsEmptySeqList(SeqList *list)
{
return 0 == list->clen;
}
int FindSeqList(SeqList *list, char *name)
{
int i=0;
int len = GetSizeSeqList(list);
for(i=0;ihead[i].name,name))
{
return i;
}
}
return -1;
}
DATATYPE *GetItemSeqList(SeqList *List,int ind)
{
if(NULL ==List)
{
return NULL;
}
int len = GetSizeSeqList(List);
if(ind < 0||ind >=len)
{
return NULL;
}
return &List->head[ind];
}
int InsertPosSeqList(SeqList *list, DATATYPE *data, int pos)
{
if(IsFullSeqList(list))
{
return 1;
}
int len = GetSizeSeqList(list);
if(pos<0||pos>len)
{
return 1;;
}
int i=0;
for(i = list->clen;i > pos;--i)
{
memcpy(&list->head[i],&list->head[i-1],sizeof(DATATYPE));
}
memcpy(&list->head[pos], data,sizeof(DATATYPE));
list->clen++;
return 0;
}
int DeleteSeqList(SeqList *list, char *name)
{
if (IsEmptySeqList(list))
{
return 1;
}
int vel=FindSeqList(list,name);
int vel=FindSeqList(list,name);
if(-1 == vel)
{
return 1;
}
int i;
int len = GetSizeSeqList(list);
for(i=vel;i<=list->clen;++i)
{
memcpy(&list->head[i], &list->head[i+1],sizeof(DATATYPE));
}
list->clen -=1;
// list->clen++;
return 0;
}
int ClearSeqList(SeqList *list)
{
return list->clen = 0;
}
int ModifySeqList(SeqList *list, char *old, DATATYPE *newdeta)
{
if (IsEmptySeqList(list))
{
return 1;
}
int vel=FindSeqList(list,old);
if(-1 == vel)
{
return 1;
}
memcpy(&list->head[vel], newdeta, sizeof(DATATYPE));
return 0;
}
int DestroySeqList(SeqList *list)
{
if(NULL == list)
{
return 1;
}
free(list->head);
free(list);
return 0;
}
(3)main.c
#include "seqlist.h"
#include
int main(int argc,char **argv)
{
SeqList *s1 = CreateSeqList(5);
DATATYPE data[]={
{"zhangsan",'F',20,80},
{"san",'M',21,81},
{"zhan",'F',41,85},
{"gsan",'M',35,82},
{"an",'M',22,90},
};
InsertTailSeqList(s1,&data[0]);
InsertTailSeqList(s1,&data[1]);
InsertTailSeqList(s1,&data[2]);
ShowSeqList(s1);
printf("***************shan***\n");
DeleteSeqList(s1, "zhangsan");
// InsertPosSeqList(s1, &data[2],3);
ShowSeqList(s1);
// int ret = FindSeqList(s1,"zhangsan");
// if(-1 ==ret)
// {
// printf("not found");
// }
// else
// {
// DATATYPE *tmp = GetItemSeqList(s1,ret);
// printf("%s %d\n",tmp->name,tmp->score);
// }
return 0;
}
5.线性表顺序存储的优点,缺点
(1)优点
1)无需为表中的逻辑关系增加额外的存储空间
2)可以快速随机访问元素O(1)
(2)缺点
1)插入,删除元素需要移动元素o(n)
2)无法动态存储。
三、vs—code的一些操作
(1)表头结果:放数组的状态信息,head:数组名,是指针指向首元素地址;tlen:总长度;clen:当前长度,代表使用的有效长度;