线性表

一、顺序表

顺序表的定义

  • 初始化顺序表
//基本操作-初始化一个顺序表
void InitList(SqList &L){
    for(int i=0;i
  • 如果去掉默认值的设置的步骤,则会出现“脏数据”的现象(内存中遗留的)正常情况下把各个数据元素的值设为默认值
  • 将length设置为0不可省略

顺序表的实现(动态分配)

//初始化
void InitList(SeqList &L){
    //使用malloc函数申请一片连续的存储空间
    L.data = (int *)malloc(InitSize * sizeof(int));
    L.length = 0;
    L.MaxSize = InitSize;
}
//增加动态数据的长度
void IncreaseSize(SeqList &L,int len){
    int *p = L.data;
    L.data = (int *)malloc((L.MaxSize+len)*sizeof(int));
    for(int i=0;i

realloc函数也可实现

顺序表的查找

顺序表的查找有两种方式:

  • 按位查找
  • 按值查找
    代码:
//按位查找
ElemType GetElem(SeqList L;int i){
    return L.data[i-1];
}

二、链表

单链表的初始化

单链表的建立

  • 尾插法
  • 头插法

对应代码

  • 尾插法
LinkList List_TailInsert(LinkList &L){  //正向建立单链表
    int x; //设置ElemType为整型
    L = (LinkList)malloc(sizeof(LNode)); //建立头节点
    LNode *s, *r=L;   //r为表尾指针
    scanf("%d",&x);
    while(x!=9999){  //输入9999表示结束
        s = (LNode *)malloc(sizeof(LNode))
        s->data = x;
        r->next = s;
        r = s;                  //r指向新的表尾结点
        scanf("%d",&x);
    }
    r->next = NULL;  //尾结点指针置空
    return L;
}
  • 头插法
LinkList List_HeadInsert(LinkList &L){  //逆向建立单链表
    LNode *s;
    int x;
    L = (LinkList)malloc(sizeof(LNode)); //建立头节点
    L->next = NULL; //初始为空链表
    scanf("%d",&x);   //输入节点的值
    while(x!=9999){  //输入9999表示结束
        s = (LNode *)malloc(sizeof(LNode)) //创建新结点
        s->data = x; 
        s->next = L->next;
        L->next = s;
        scanf("%d",&x);
    }
    return L;
}

双链表

双链表的初始化

//结点 double node
typedef struct DNode{   //定义双链表结点类型
    ElemType data;      //数据域
    struct DNode *prior, *next;    //前驱和后继指针
}DNode, *DLinkList;

//初始化双链表(带头结点)
bool InitDLinkList(DLinkList &L){
    L = (DNode *)malloc(sizeof(DNode));   ///分配一个头结点
    if (L==NULL)
        return false;
    L->prior = NULL;    //头结点的prior永远指向NULL
    L->next = NULL;    //头结点之后暂时还没有结点
    return true;
}

双链表的插入

//在p结点之后插入s结点
bool InsertNextDNode(DNode *p,DNode *s){
    if (p==NULL || s==NULL)   //非法参数
        return false;
    s->next = p->next;
    if (p-next != NULL)  //如果p结点有后继结点
        p->next->prior = s;
    s->prior = p;
    p->next = s;
    return true;
}

你可能感兴趣的:(线性表)