数据结构
第一章 绪论
一:基本语言描述功能
(1): 函数结果状态代码:
#define TRUE 1
#define FALSE 0
#define OK
1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW
-2
(2):数据结构中元素类型一般约定为ElemType
(3)Status是函数的类型. 对于具体问题,可以是int.char等,用Status是代表大多数,非常一般的情况
(4)结束语句
函数结束语句
return 表达式;
Return;
Case结束语句
break;
异常结束语句
exit(异常代码) ;
二:抽象数据类型Triplet的实现
(1):创建一个三元组
Status InitTriplet(Triplet &T, ElemType V1, ElemType V2, ElemType V3){
T=(ElemType*)malloc(3 *sizeof(ElemType));
If(!T) exit(OVERFLOW);
T[0]=V1; T[1]=V2; T[2]=V3;
Return OK;
}
这个函数比较重要.可以与以后几章的函数比较.
三:时间复杂度
(1)频度:指的是该语句被重复执行的次数
如: (a){++x;s=0;}
(b){for(i=1;i<=n;++i) {++x;s+=x;}
(c){for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
{++x ;s+=x;}
基本操作“x 增1”语句频度分别为1,n,n².
(2)时间复杂度
时间复杂度与频度的关系:T(n)=O(f(n))
对于(1)中的时间复杂度分别为O(1),O(n),O(n²).
第二章 线性表
一:基本概念
(1):前驱与后继
除第一个元素外,集合中每个元素只有一个前驱;除最后一个元素外,集合中每个元素只有一个后继.
(2)分类
可分为顺序线性表和链式线性表.一般用SqList表示顺序表,用LinkList表示链表.
二:顺序表
(1):基本结构:
# define LIST_INIT_SIZE 100 //线性表存储结构的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量
Typedef struct{
ElemType *elem; //存储空间基址
Int length;
//当前长度
Int Listsize
//当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;
(2)几个关于顺序表的重要函数
1:构造一个空的顺序表
Status InitList_Sq(SqList &L){
L.elem=(ElemType *)malloc(LIST_INIT_SIZE *sizeof(ElemType));
If(!L.elem) exit(OVERFLOW);
L.length=0;
L.listsize= LIST_INIT_SIZE;
return OK;
}
2:在顺序表L中的第i个位置之前插入新的元素e
Status ListInsert_Sq(SqList &L,int i, ElemType e) {
If(i<1 || i>L.length+1) return ERROR;
If(L.length>=L.Listsize) {
newbase=(ElemType*)realloc(L.elem,(L.Listsize+LISTINCREMENT)*sizeof(ElemType);
if(!newbase) return(OVERFLOW);
L.elem=newbase;
L.Listsize+= LISTINCREMENT;
}
q=&(L.elem[i-1]);
for(p=&(L.length-1);p>=q;--p) *(p+1)=*p;
*q=e;
++L.length;
return OK;
}
三:链表
(1):基本结构
Typedef struct LNode{
ElemType
data; //数据域
Struct LNode *next; //指针域
}LNode,*LinkList;
(2)几个重要函数
数据结构
1:创建链表
LinkList createList(LinkList head)
{ /*功能:建立有头节点head的数据单链表,head中存放数据*/
LinkList p,q;
p=q=(LinkList)malloc(sizeof(LNode));
printf("/n input data:/n");
scanf("%d",&p->data);
p->next=NULL;
while(p->data>0){ /*建立链表的输入数据必须大于0,数据输入时以输入任何负数作为结束*/
if(head==NULL) head=p; /*原连表为空*/
else{
q->next=p;
q=p;
}
p=(LinkList)malloc(sizeof(LNode));
printf("/ninput data:/n");
scanf("%d",&p->data);
p->next=NULL;
}
return head;
LinkList createList(LinkList head)
{ /*功能:建立有头节点head的数据单链表,head中存放数据*/
LinkList p,q;
p=q=(LinkList)malloc(sizeof(LNode));
printf("/n input data:/n");
scanf("%d",&p->data);
p->next=NULL;
while(p->data>0){ /*建立链表的输入数据必须大于0,数据输入时以输入任何负数作为结束*/
if(head==NULL) head=p; /*原连表为空*/
else{
q->next=p;
q=p;
}
p=(LinkList)malloc(sizeof(LNode));
printf("/ninput data:/n");
scanf("%d",&p->data);
p->next=NULL;
}
return head;
}
2:输出链表
void print(LinkList head)
{/*输出链表数据*/
LinkList r;
r=head;
printf("/noutput data:/n");
while(r!=NULL){
printf("%d ",r->data);
r=r->next;
}
}
void print(LinkList head)
{/*输出链表数据*/
LinkList r;
r=head;
printf("/noutput data:/n");
while(r!=NULL){
printf("%d ",r->data);
r=r->next;
}
}
3:输出链表的第i个元素
Status GetElem_L(LinkList L, int I,ElemType &e){
P=L->next; j=1;
While(p&&j<i){
P=p->next;++j;}
If(!p || j>1) return ERROR;
e=p->data;
return OK;
}
Status GetElem_L(LinkList L, int I,ElemType &e){
P=L->next; j=1;
While(p&&j<i){
P=p->next;++j;}
If(!p || j>1) return ERROR;
e=p->data;
return OK;
}