数据结构笔记

 
数据结构
第一章 绪论
一:基本语言描述功能
(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;
}
 
2:输出链表
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;
}
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值