数据结构自学总结1线性结构.docx
- 文档编号:29828399
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:82
- 大小:43.58KB
数据结构自学总结1线性结构.docx
《数据结构自学总结1线性结构.docx》由会员分享,可在线阅读,更多相关《数据结构自学总结1线性结构.docx(82页珍藏版)》请在冰豆网上搜索。
数据结构自学总结1线性结构
数据结构自学总结
--第一阶段线性结构
1.数据结构概论
1.1时间复杂度:
程序执行的次数T=O(n);
1.2空间复杂度:
出现执行时所占用的内存空间;
1.3数据结构的定义:
狭义:
是专门研究数据存储的问题
数据的存储包含两方面:
个体的存储+个体关系的存储
广义:
数据结构即包含数据的存储也包含数据的操作
对存储数据的操作就是算法
1.4算法的定义:
是对存储数据的操作
狭义的算法是与数据的存储方式密切相关
广义的算法是与数据的存储方式无关
泛型:
利用某种技术达到的效果就是:
不同的存储方式,执行的操作是一样的。
1.5利用结构体定义自己的数据类型
typedefstructStudent
{
intsid;
charname[100];
charsex;
}*PST,STU;//PST等于structstudent*,STU代表了structStudent
2.线性结构
2.1连续存储(顺序表,数组):
元素类型相同,大小相等
优点:
存取速度很快
缺点:
实现必须知道数组的长度
需要大块连续的内存快
插入删除元素的效率极低
空间通常是有限的
2.2离散存储(链表)
优点:
空间没有限制
插入删除元素很快
缺点:
存取速度很慢
定义:
n个节点离散分配
彼此通过指针相连
每个节点只有一个前驱节点,每个节点只有一个后续节点
首节点没有前驱节点尾节点没有后续节点
专业术语:
首节点:
第一个有效节点
尾节点:
最后一个有效节点
头结点:
第一个有效节点之前的那个节点,头结点并不存放有效数据,加头节点是为了方便对链表的操作,头结点的数据类型和首节点的数据类型一样
头指针:
指向头结点的指针变量
尾指针:
指向尾节点的指针变量
如何确定一个链表需要几个参数?
如果希望通过一个函数来对链表进行处理,我们至少要接受链表的哪些参数的问题
只需要一个参数:
头指针,因为通过头指针可以推算出链表的所有信息
一个节点的生成:
structNode
{
intdata;//数据域
structNode*pNext;//指针域
}Node,*PNode;//Node等价于StructNode,PNode等价于StructNOde*类型
2.3链表的分类:
单链表:
双链表:
每一个节点有两个指针域
循环链表:
能通过任何一个节点找到其他所有的结点
非循环链表:
算法:
遍历
查找
清空
销毁
求长度
排序
删除节点:
r=p->pNext;p->pNext=q;q->pNext=r;
或者是q->pNext=p->pNext;p->pNext=q
注意:
p->pNext表示p指向的那个节点的pNext成员
插入节点
3各种数据结构的实现算法以及相关操作方法的实现
3.1实现顺序表的各种基本运算
/*
2012年2月20日22:
32:
41
目的:
实现顺序表中常用的9个操作方法,并实现测试之
*/
#include
#include
#defineMaxSize50
typedefcharElemType;
typedefstruct
{
ElemTypedata[MaxSize];
intlength;
}SqList;
externvoidInitList(SqList*&L);//形参的改变映射给实参
externvoidDestroyList(SqList*L);
externintListEmpty(SqList*L);
externintListLength(SqList*L);
externvoidDispList(SqList*L);
externintGetElem(SqList*L,inti,ElemType&e);
externintLocateElem(SqList*L,ElemTypee);
externintListInsert(SqList*&L,inti,ElemTypee);
externintListDelete(SqList*&L,inti,ElemType&e);
intmain(void)
{
SqList*L;
ElemTypee;
printf("\n=============顺序表中所有方法的实现===================\n");
printf("
(1)初始化顺序表L\n");
InitList(L);
printf("
(2)依次采用尾插法插入a,b,c,d,e元素\n");
ListInsert(L,1,'a');
ListInsert(L,2,'b');
ListInsert(L,3,'c');
ListInsert(L,4,'d');
ListInsert(L,5,'e');
printf("(3)输出顺序表L:
");
DispList(L);
printf("(4)顺序表L长度=%d\n",ListLength(L));
printf("(5)顺序表L为%s\n",(ListEmpty(L)?
"空":
"非空"));
GetElem(L,3,e);
printf("(6)顺序表L的第3个元素=%c\n",e);
printf("(7)元素a的位置=%d\n",LocateElem(L,'a'));
printf("(8)在第4个元素位置上插入f元素\n");
ListInsert(L,4,'f');
printf("(9)输出顺序表L:
");
DispList(L);
printf("(10)删除L的第3个元素\n");
ListDelete(L,3,e);
printf("(11)输出顺序表L:
");
DispList(L);
printf("(12)释放顺序表L\n");
DestroyList(L);
return0;
}
voidInitList(SqList*&L)
{
L=(SqList*)malloc(sizeof(SqList));
L->length=0;
}
voidDestroyList(SqList*L)
{
free(L);
}
intListEmpty(SqList*L)
{
return(L->length==0);
}
intListLength(SqList*L)
{
return(L->length);
}
voidDispList(SqList*L)
{
inti;
if(ListEmpty(L))return;
for(i=0;i
printf("%c",L->data[i]);
printf("\n");
}
intGetElem(SqList*L,inti,ElemType&e)
{
if(i<1||i>L->length)
return0;
e=L->data[i-1];
return1;
}
intLocateElem(SqList*L,ElemTypee)
{
inti=0;
while(i
=e)i++;
if(i>=L->length)
return0;
else
returni+1;
}
intListInsert(SqList*&L,inti,ElemTypee)
{
intj;
if(i<1||i>L->length+1)
return0;
i--;//将顺序表位序转化为elem下标*/
for(j=L->length;j>i;j--)//将data[i]及后面元素后移一个位置*/
L->data[j]=L->data[j-1];
L->data[i]=e;
L->length++;//顺序表长度增1*/
return1;
}
intListDelete(SqList*&L,inti,ElemType&e)
{
intj;
if(i<1||i>L->length)
return0;
i--;//将顺序表位序转化为elem下标*/
e=L->data[i];
for(j=i;j
L->data[j]=L->data[j+1];
L->length--;
return1;
}
/*
在VC++6.0中的输出结果为:
=============顺序表中所有方法的实现===================
(1)初始化顺序表L
(2)依次采用尾插法插入a,b,c,d,e元素
(3)输出顺序表L:
abcde
(4)顺序表L长度=5
(5)顺序表L为非空
(6)顺序表L的第3个元素=c
(7)元素a的位置=1
(8)在第4个元素位置上插入f元素
(9)输出顺序表L:
abcfde
(10)删除L的第3个元素
(11)输出顺序表L:
abfde
(12)释放顺序表L
Pressanykeytocontinue
总结:
当调用DestroyList(L)后,free释放的事L指向的内存空间,但是此时,指针变量L仍然存在
3.2实现单链表的各种基本运算
/*
2012年2月22日19:
05:
12作者:
陈金林
目的:
实现单链表的基本方法,并实现之
*/
#include
#include
#defineMaxSize50
typedefcharElemType;
typedefstructLNode
{
ElemTypedata;
structLNode*next;
}LinkList;
voidInitList(LinkList*&L);
intListInsert(LinkList*&L,inti,ElemTypee);
voidDispList(LinkList*L);
intListLength(LinkList*L);
intListEmpty(LinkList*L);
intGetElem(LinkList*L,inti,ElemType&e);
intLocateElem(LinkList*L,ElemTypee);
intListDelete(LinkList*&L,inti,ElemType&e);
voidDestroyList(LinkList*&L);
intmain(void)
{
LinkList*h;
ElemTypee;
printf("\n================实现单链表的常用操作============\n");
printf("
(1)初始化单链表h\n");
InitList(h);
printf("
(2)依次采用尾插法插入a,b,c,d,e元素\n");
ListInsert(h,1,'a');
ListInsert(h,2,'b');
ListInsert(h,3,'c');
ListInsert(h,4,'d');
ListInsert(h,5,'e');
printf("(3)输出单链表h");
DispList(h);
printf("(4)输出单链表h长度%d\n",ListLength(h));
printf("(5)判断单链表h是否为空%s\n",(ListEmpty(h)==0)?
"空":
"非空");
GetElem(h,3,e);
printf("(6)输出单链表h的第三个元素%d\n",e);
printf("(7)输出元素'a'的位置%d\n",LocateElem(h,'a'));
printf("(8)在第四个元素位置上插入'f'元素\n");
ListInsert(h,4,'f');
printf("(9)输出单链表h");
DispList(h);
printf("(10)删除h的第3个元素\n");
ListDelete(h,3,e);
printf("(11)输出单链表h:
");
DispList(h);
printf("(12)释放单链表h\n");
DestroyList(h);
return0;
}
voidInitList(LinkList*&L)
{
L=(LinkList*)malloc(sizeof(LinkList));
L->next=NULL;
}
intListInsert(LinkList*&L,inti,ElemTypee)
{
intj=0;
LinkList*p=L,*s;
while(j =NULL) { j++; p=p->next; } if(p==NULL) return0; else { s=(LinkList*)malloc(sizeof(LinkList)); s->data=e; s->next=p->next; p->next=s; return1; } } voidDispList(LinkList*L) { LinkList*p=L->next; while(p! =NULL) { printf("%c",p->data); p=p->next; } printf("\n"); } intListLength(LinkList*L) { LinkList*p=L; intn=0; while(p->next! =NULL) { n++; p=p->next; } return(n); } intListEmpty(LinkList*L) { return(L->next==NULL); } intGetElem(LinkList*L,inti,ElemType&e) { intj=0; LinkList*p=L; while(j =NULL) { j++; p=p->next; } if(p==NULL) return0; else { e=p->data; return1; } } intLocateElem(LinkList*L,ElemTypee) { LinkList*p=L->next; inti=1; while(p! =NULL&&p->data! =e) { p=p->next; i++; } if(p==NULL) return(0); else return(i); } intListDelete(LinkList*&L,inti,ElemType&e) { intj=0; LinkList*p=L,*q; while(j =NULL) { j++; p=p->next; } if(p==NULL) return0; else { q=p->next; if(q==NULL) return0; e=q->data; p->next=q->next; free(q); return1; } } voidDestroyList(LinkList*&L) { LinkList*p=L,*q=p->next; while(q! =NULL) { free(p); p=q; q=p->next; } free(q); } /* 在VC++6.0中的输出结果为: =======================实现单链表的常用操作================= (1)初始化单链表h (2)依次采用尾插法插入a,b,c,d,e元素 (3)输出单链表habcde (4)输出单链表h长度5 (5)判断单链表h是否为空空 (6)输出单链表h的第三个元素99 (7)输出元素'a'的位置1 (8)在第四个元素位置上插入'f'元素 (9)输出单链表habcfde (10)删除h的第3个元素 (11)输出单链表h: abfde (12)释放单链表h Pressanykeytocontinue */ 3.3实现双链表的各种基本运算 #include #include #defineMaxSize50 typedefcharElemType; typedefstructDNode { ElemTypedata; structDNode*prior; structDNode*next; }DLinkList; externvoidInitList(DLinkList*&L);//以下均为外部函数 externvoidDestroyList(DLinkList*&L); externintListEmpty(DLinkList*L); externintListLength(DLinkList*L); externvoidDispList(DLinkList*L); externintGetElem(DLinkList*L,inti,ElemType&e); externintLocateElem(DLinkList*L,ElemTypee); externintListInsert(DLinkList*&L,inti,ElemTypee); externintListDelete(DLinkList*&L,inti,ElemType&e); intmain(void) { DLinkList*h; ElemTypee; printf("\n========双链表所有操作方法的实现====作者: 陈金林======\n"); printf(" (1)初始化双链表h\n"); InitList(h); printf(" (2)依次采用尾插法插入a,b,c,d,e元素\n"); ListInsert(h,1,'a'); ListInsert(h,1,'b'); ListInsert(h,1,'c'); ListInsert(h,1,'d'); ListInsert(h,1,'e'); printf("(3)输出双链表h: "); DispList(h); printf("(4)输出双链表h的长度%d\n",ListLength(h)); printf("(5)双链表h为%s\n",(ListEmpty(h)? "空": "非空")); GetElem(h,3,e); printf("(6)输出双链表h的第3个元素%c\n",e); printf("(7)输出元素'a'的位置%d\n",LocateElem(h,'a')); printf("(8)在第4个元素的位置上插入'f'元素\n"); printf("(9)输出双链表h: "); DispList(h); printf("(10)删除h的第三个元素\n"); ListDelete(h,3,e); printf("(11)输出双链表h: "); DispList(h); printf("(12)释放双链表h\n"); DestroyList(h); return0; } voidInitList(DLinkList*&L) { L=(DLinkList*)malloc(sizeof(DLinkList));//创建头结点 L->prior=L->next=NULL; } voidDestroyList(DLinkList*&L) { DLinkList*p=L,*q=p->next; while(q! =NULL) { free(p); p=q; q=p->next; } free(p); } intListEmpty(DLinkList*L) { return(L->next==NULL); } intListLength(DLinkList*L) { DLinkList*p=L;inti=0; while(p->next! =NULL) { i++; p=p->next; } return(i); } voidDispList(DLinkList*L) { DLinkList*p=L->next; while(p! =NULL) { printf("%c",p->data); p=p->next; } printf("\n"); } intGetElem(DLinkList*L,inti,ElemType&e) { intj=0; DLinkList*p=L; while(j =NULL) { j++; p=p->next; } if(p==NULL) return0; else { e=p->data; return1; } } intLocateElem(DLinkList*L,ElemTypee) { intn=1; DLinkList*p=L->next; while(p! =NULL&&p->data! =e) { n++; p=p->next; } if(p==NULL) return(0); else return(n); } intListInsert(DLinkList*&L,inti,ElemTypee) { intj=0;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 自学 总结 线性 结构