王道数据结构2-6章数据结构存储结构定义及基本操作

2.1 线性表基本操作
InitList(&L)       //初始化表
Length(L)           //求表长
LocateElem(L,e)     //按值查找
GetElem(L,i)        //按位查找,获取表L中第i个位置的元素
ListInsert(&L,i,e)  //插入操作,第i个位置插入指定元素
ListDelete(&L,i,e)  //删除操作,删除第i个位置的元素
PrintList(L)        //输出操作
Empty(L)            //判空操作,如果是空表,则返回true
DestroyList(&L)     //销毁操作
2.2 顺序表的定义
#define MaxSize 50
typedef struct {
    ElemType data[MaxSize];int length;
}SqList;
2.3 单链表的定义
typedef struct LNode{
    ElemType data;
    struct LNode* next;
}LNode,*LinkList;
2.4 静态链表的定义
typedef struct{
    ElemType data;
    int next;
}SLinkList[MaxSize];
3.1 栈的基本操作
InitStack(&S)
StackEmpty(S)           //判断是否为空
Push(&S,x)
Pop(&S,x)
GetTop(S,&x)
DestroyStack(&S)
3.2 顺序栈存储类型描述
typedef struct{
    ElemType data[MaxSize];
    int top;
}SqStack;
3.3 栈的链式存储
typedef struct Linknode{
    ElemType data;
    struct Linknode* next;
}*LiStack;
3.4 队列的基本操作
InitQueue(&Q)
QueueEmpty(Q)
EnQueue(&Q,x)
DeQueue(&Q,&x)
GetHead(Q,&x)
3.5 顺序存储类型定义
typedef struct{
    ElemType data[MaxSize];
    int front,rear;
}SqQueue;
3.6 链式存储
typedef struct Linknode{
    ElemType data;
    struct Linknode* next;
}Linknode;
typedef struct{
    Linknode *front,*rear;
}LinkQueue;
4.1 简单的模式匹配算法
int Index(SString S,SString T)
{
    int i = 1,j = 1;
    while (i <= S.length && j <= T.length) {
        if (S.ch[i] == T.ch[j]) {
            ++i;++j;
        } else {
            i = i-j+2;j = 1;
        }
    }
    if (j > T.length) {
        return i-T.length;
    } else return 0;
}
4.2 KMP
void get_next(String T,int next[]) 
{
    int i = 1,j = 0;
    next[1] = 0;
    while (i < T.length) {
        if(j == 0||T.ch[i]==T.ch[j]) {
            ++i;++j;
            next[i] = j;
        } else {
            j = next[j];
        }
    }
}

int Index_KMP(String T,String S,int next[])
{
    int i = 1,j = 1;
    while (i <= S.length&&j <= T.length) {
        if (j == 0||S.ch[i] == T.ch[j]) {
            ++i;++j;
        } else {
            j = next[j];
        }
    }
    if (j > T.length) {
        return i - T.length;
    } else
        return 0;
}

手算 n e x t next next 数组

4.3 改进的next
void get_nextval(String T,int nextval[])
{
    int i = 1,j = 0;nextval[1] = 0;
    while (i < T.length) {
        if (j == 0||T.ch[i] == T.ch[j]) {
            ++i;++j;
            if (T.ch[i]!=T.ch[j]) nextval[i] = j;
            else nextval[i] = nextval[j];
        } else {
            j = nextval[j];
        }
    }
}
5.1 二叉树链式存储结构
typedef struct BiTNode {
    ElemType data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
5.2 二叉线索树存储结构
typedef struct ThreadNode{
    ElemType data;
    struct ThreadNode *lchild,*rchild;
    int ltag,rtag;
}ThreadNode,*ThreadTree;
5.3 树,森林存储结构
//双亲表示法
typedef struct{
    ElemType data;
    int parent;
}PTNode;
typedef struct {
    PTNode nodes[MaxSize];
    int n;
}PTree;

//孩子兄弟表示法
typedef struct CSNode{
    ElemType data;
    strcut CSNode *firstchild,*nextsibling;//第一个孩子和右兄弟指针
}CSNode,*CSTree;
6.1 图的邻接矩阵
typedef struct{
    VertexType Vex[MaxVertexNum];
    EdgeType Edge[MaxVertexNum][MaxVertexNum];
    int vexnum,arcnum;
}MGraph;
6.2 图的邻接表存储
typedef struct ArcNode{
    int adjvex;
    struct ArcNode *next;
}ArcNode;
typedef struct VNode{
    VertexType data;
    ArcNode *first;
}VNode ,AdjList[MaxVertexNum];
typedef struct{
    AdjList vertices;//邻接表
    int vexnum,arcnum;
}ALGraph;//ALGraph是以邻接表存储的图类型
6.3 图的基本操作
Adjacent(G,x,y)         //判断图是否存在边<x,y>
Neighbors(G,x)          //列出图G中与结点x邻接的边
InsertVertex(G,x)       //在图中插入顶点x
DeleteVertex(G,x)       //在图中删除顶点x
AddEdge(G,x,y)          //添加
RemoveEdge(G,x,y)       //删除该边
FirstNeighbor(G,x)      //求图中顶点x的第一个邻接点,返回顶点号
NextNeighbor(G,x,y)     //假设顶点y是顶点x的一个邻接点,返回除y之外的顶点x的下一个邻接点的顶点号
Get_edge_value(G,x,y)   //获取权值
Set_edge_value(G,x,y,v) //设置权值

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
王道数据结构书中讨论了栈的链式存储的实现。链式存储结构是一种常见的栈的实现方式。在链式存储结构中,栈的每个元素都是一个节点,节点中包含了数据元素和指向下一个节点的指针。通过将节点按照特定的方式连接起来,形成一个链表的结构,从而实现了栈的功能。 在链式存储结构中,栈的插入和删除操作都是在链表的头部进行的,即将新的节点插入到链表的头部作为栈顶元素,或者将链表的头部节点删除作为栈顶元素出栈。这种方式的好处是插入和删除操作的时间复杂度都是O(1),即常数时间,因为只需要修改链表的指针即可。而在顺序存储结构中,插入和删除操作的时间复杂度是O(n),需要移动其他元素。 在王道数据结构书中,可能会对链式存储结构的实现进行详细的介绍,包括节点的定义、插入和删除操作的具体步骤等。如果你需要更详细的信息,建议参考相关节的内容。<span class="em">1</span> #### 引用[.reference_title] - *1* [王道数据结构+C语言版+超全笔记(图文)+个人整理版本](https://download.csdn.net/download/weixin_44071580/85079507)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疯狂的码泰君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值