2021年自考02331数据结构重点总结最终修订

2021年自考02331数据结构重点总结最终修订
2021年自考02331数据结构重点总结最终修订

自考02331数据构造重点总结(最后修订)

第一章概论

1.瑞士计算机科学家沃思提出:算法+数据构造=程序。算法是对数据运算描述,而数据构造涉及逻辑构造和存储构造。由此可见,程序设计实质是针对实际问题选取一种好数据构造和设计一种好算法,而好算法在很大限度上取决于描述实际问题数据构造。

2.数据是信息载体。数据元素是数据基本单位。一种数据元素可以由若干个数据项构成,数据项是具备独立含义最小标记单位。数据对象是具备相似性质数据元素集合。

3.数据构造指是数据元素之间互有关系,即数据组织形式。

数据构造普通涉及如下三方面内容:数据逻辑构造、数据存储构造、数据运算

①数据逻辑构造是从逻辑关系上描述数据,与数据元素存储构造无关,是独立于计算机。

数据逻辑构造分类:线性构造和非线性构造。

线性表是一种典型线性构造。栈、队列、串等都是线性构造。数组、广义表、树和图等数据构造都是非线性构造。

②数据元素及其关系在计算机内存储方式,称为数据存储构造(物理构造)。

数据存储构造是逻辑构造用计算机语言实现,它依赖于计算机语言。

③数据运算。最惯用检索、插入、删除、更新、排序等。

4.数据四种基本存储办法:顺序存储、链接存储、索引存储、散列存储

(1)顺序存储:普通借助程序设计语言数组描述。

(2)链接存储:普通借助于程序语言指针来描述。

(3)索引存储:索引表由若干索引项构成。核心字是能唯一标记一种元素一种或各种数据项组合。

(4)散列存储:该办法基本思想是:依照元素核心字直接计算出该元素存储地址。

5.算法必要满足5个准则:输入,0个或各种数据作为输入;输出,产生一种或各种输出;有穷性,算法执行有限步后结束;拟定性,每一条指令含义都明确;可行性,算法是可行。

算法与程序区别:程序必要依赖于计算机程序语言,而一种算法可用自然语言、计算机程序语言、数学语言或商定符号语言来描述。当前惯用描述算法语言有两类:类Pascal和类C。

6.评价算法优劣:算法"对的性"是一方面要考虑。此外,重要考虑如下三点:

①执行算法所耗费时间,即时间复杂性;

②执行算法所耗费存储空间,重要是辅助空间,即空间复杂性;

③算法应易于理解、易于编程,易于调试等,即可读性和可操作性。

以上几点最重要是时间复杂性,时间复杂度惯用渐进时间复杂度表达。

7.算法求解问题输入量称为问题规模,用一种正整数n表达。

8.常用时间复杂度按数量级递增排列依次为:常数阶0(1)、对数阶0(log2n)、线性阶0(n)、线性对数阶0(nlog2n)、平方阶0(n2)立方阶0(n3)、…、k次方阶0(n k)、指数阶0(2n)和阶乘阶0(n!)。

9.一种算法空间复杂度S(n)定义为该算法所耗费存储空间,它是问题规模n函数,它涉及存储算法自身所占存储空间、算法输入输出数据所占存储空间和算法在运营过程中暂时占用存储空间。

第二章线性表

1.数据运算是定义在逻辑构造上,而运算详细实现是在存储构造上进行。

2.只要拟定了线性表存储起始位置,线性表中任意一种元素都可随机存取,因此顺序表是一种随机存取构造。

3.常用线性表基本运算:

(1)置空表InitList(L)构造一种空线性表L。

(2)求表长ListLength(L)求线性表L中结点个数,即求表长。

(3)GetNode(L,i)取线性表L中第i个元素。

(4)LocateNode(L,x)在L中查找第一种值为x 元素,并返回该元素在L中位置。若L中没有元素值为x ,则返回0值。

(5)InsertList(L,i,x)在线性表L第i个元素之前插入一种值为x 新元素,表L长度加1。

(6)DeleteList(L,i)删除线性表L第i个元素,删除后表L长度减1。

4.顺序存储办法:把线性表数据元素按逻辑顺序依次存储在一组地址持续存储单元里办法。

顺序表(Sequential List):用顺序存储办法存储线性表称为顺序表。顺序表是一种随机存取构造,顺序表特点是逻辑上相邻结点其物理位置亦相邻。

顺序表中结点a i存储地址:LOC(a i)= LOC(a1)+(i-1)*c 1≤i≤n,

5.顺序表上实现基本运算:

(1)插入:该算法平均时间复杂度是O(n),即在顺序表上进行插入运算,平均要移动一半结点(n/2)。

在第i个位置插入一种结点移动次数为n-i+1

(2)删除:顺序表上做删除运算,平均要移动表中约一半结点(n-1)/2,平均时间复杂度也是O(n)。

删除第i个结点移动次数为n-i

6.采用链式存储构造可以避免频繁移动大量元素。一种单链表可由头指针唯一拟定,因而单链表可以用头指针名字来命名。

①生成结点变量原则函数 p=( ListNode *)malloc(sizeof(ListNode)); //函数malloc分派一种类型为ListNode 结点变量空间,并将其首地址放入指针变量p中

②释放结点变量空间原则函数free(p);//释放p所指结点变量空间

③结点分量访问办法二:p-﹥data和p-﹥next

④指针变量p和结点变量*p关系:指针变量p值——结点地址,结点变量*p值——结点内容

7.建立单链表:

(1)头插法建表:算法: p=(ListNode *)malloc(sizeof(ListNode));①//生成新结点

p->data=ch;② //将读入数据放入新结点数据域中

p->next=head;③ head=p;④

(2)尾插法建表:算法: p=(ListNode *)malloc(sizeof(ListNode));①//生成新结点

p->data=ch; ② //将读入数据放入新结点数据域中

if (head==NULL) head=p;//新结点插入空表

else rear->next=p;③//将新结点插到*r之后

rear=p;④//尾指针指向新表尾

(3)尾插法建带头结点单链表:

头结点及作用:头结点是在链表开始结点之前附加一种结点。它具备两个长处:

⒈由于开始结点位置被存储在头结点指针域中,因此在链表第一种位置上操作就和在表其他位置上操作一致,不必进行特殊解决;

⒉无论链表与否为空,其头指针都是指向头结点非空指针(空表中头结点指针域空),因而空表和非空表解决也就统一了。

头结点数据域阴影表达该某些不存储信息。在有应用中可

用于存储表长等附加信息。

详细算法:r=head;// 尾指针初值也指向头结点

while((ch=getchar())!='\n'){

s=(ListNode *)malloc(sizeof(ListNode));//生成新结点

s->data=ch; //将读入数据放入新结点数据域中

r->next=s;

r=s;}

r->next=NULL;//终端结点指针域置空,或空表头结点指针域置空

以上三个算法时间复杂度均为O(n)。

8.单链表上查找:(带头结点)

(1)按结点序号查找:序号为0是头结点。

算法:p=head;j=0;//从头结点开始扫描

while(p->next&&jnext为NULL或i=j为止

p=p->next;

j++;}

if(i==j) return p;//找到了第i个结点

else return NULL;//当i<0或i>0时,找不到第i个结点

时间复杂度:在等概率假设下,平均时间复杂度为:为n/2=O(n)

(2)按结点值查找:

详细算法:ListNode *p=head->next;//从开始结点比较。表非空,p初始值指向开始结点 while(p&&p->data!=key)//直到p为NULL或p->data为key为止

p=p->next;//扫描下一结点

return p;//若p=NULL,则查找失败,否则p指向值为key结点时间复杂度为:O(n)

9.插入运算:插入运算是将值为x新结点插入到表第i个结点位置上,即插入到a i-1与a i之间。

s=(ListNode *)malloc(sizeof(ListNode));② s->data=x;③ s->next=p->next;④ p->next=s;⑤

算法时间重要耗费在查找结点上,故时间复杂度亦为O(n)。

10.删除运算

r=p->next;②//使r指向被删除结点a i p->next=r->next③;//将a i从链上摘下free(r);④//释放结点a i空间给存储池

算法时间复杂度也是O(n).p指向被删除前一种结点。

链表上实现插入和删除运算,不必移动结点,仅需修改指针。

11.单循环链表—在单链表中,将终端结点指针域NULL改为指向表头结点或开始结点即可。判断空链表条件是head==head->next;

12.仅设尾指针单循环链表:用尾指针rear表达单循环链表对开始结点a1和终端结点a n查找时间都是O(1)。而表操作经常是在表首尾位置上进行,因而,实用中多采用尾指针表达单循环链表。判断空链表条件为rear==rear->next;

13.循环链表:循环链表特点是不必增长存储量,仅对表链接方式稍作变化,即可使得表解决更加以便灵活。若在尾指针表达单循环链表上实现,则只需修改指针,不必遍历,其执行时间是O(1)。

详细算法:

LinkList Connect(LinkList A,LinkList B) {//假设A,B为非空循环链表尾指针

LinkList p=A->next;//①保存A表头结点位置

A->next=B->next->next;//②B表开始结点链接到A表尾

free(B->next);//③释放B表头结点

相关主题
相关文档
最新文档