数据结构之线性表(附代码)

ListInsert(L,5,7);

int e = -1;//用变量e吧删除的元素带回来

if(ListDelete(L,1,e))

cout << “已经删除第三个元素,删除的元素值是:” << e << endl;

else

cout << “位序i不合法,删除失败” << endl;

for(int i = 0; i < L.length; i++){

cout << i << " " << L.data[i] << endl;

}

cout << “按位查找:” << endl;

cout << GetElem(L,3) << endl;

cout << “按值查找:” << endl;

cout << LocateElem(L,6) << endl;

return 0;

}

单链表


#include <bits/stdc++.h>

using namespace std;

typedef struct LNode{

int data;

struct LNode *next;

}LNode, *LinkList;

//初始化一个空的单链表

bool InitList(LinkList &L){

L = NULL;//空表 暂时还没有任何节点

return true;

}

//在第i个位置插入元素e(带头结点)

bool ListInsert(LinkList &L, int i, int e){

if(i < 1)

return false;

LNode *p;//指针P指向当前扫描到的节点

int j = 0;//当前p指向的是第几个结点

p = L;//L指向头结点,头结点是第0个结点(不存数据)

while(p != NULL && j < i - 1){

p = p->next;

j++;

}

if(p == NULL)

return false;

LNode *s = (LNode *)malloc(sizeof(LNode));

s->data = e;

s->next = p->next;

p->next = s;//将结点s连接到o之后

return true;//插入成功

}

//不带头结点

bool ListInsert1(LinkList &L, int i, int e){

if(i < 1)

return false;

if(i == 1)

{

LNode *s = (LNode *)malloc(sizeof(LNode));

s->data = e;

s->next = L;

L = s;

return true;

}

LNode *p;

int j = 1;//当前p指向的第几个结点

p = L;

while(p!=NULL && j < i - 1){

p = p->next;

j++;

}

if(p == NULL)

return false;

LNode *s = (LNode *)malloc(sizeof(LNode));

s->data = e;

s->next = p->next;

p->next = s;

return true;

}

//后插操作:在P结点之后插入e

bool InsertNextNode(LNode *p, int e){

if(p == NULL)

return false;

LNode *s = (LNode *)malloc(sizeof(LNode));

if(s == NULL)

return false;

s->data = e;

s->next = p->next;

p->next = s;

return true;

}

//前插操作:在p结点之前插入元素e

bool InsertPriorNode(LNode *p, int e){

if(p == NULL)

return false;

LNode *s = (LNode *)malloc(sizeof(LNode));

if(s == NULL)

return false;

s->next = p->next;

p->next = s;

s->data = p->data;//将p中元素复制到s中

p->data = e;

return true;

}

//按位查找,返回第i个元素(带头结点)

LNode * GetElem(LinkList L, int i){

if(i < 0)

return NULL;

LNode *p;

int j = 0;

p = L;

while(p != NULL && j < i){

p = p->next;

j++;

}

return p;

}

//按值查找,找到数据域==e的节点

LNode * LocateElem(LinkList L,int e){

LNode *p = L->next;

while(p != NULL && p->data != e)

p = p->next;

return p;//找到后返回该节点指针,否则返回NULL

}

//求表的长度

int Length(LinkList L){

int len = 0;

LNode *p = L;

while(p->next != NULL)

{

p = p->next;

len++;

}

return len;

}

bool ListDelete(LinkList &L, int i, int e){

if(i < 1)

return false;

LNode *p;

int j = 0;

p = L;

while(p != NULL &&j < i - 1){

p = p->next;

j++;

}

if(p == NULL)

return false;

if(p->next = NULL)//第i - 1个结点之后已无其他结点

return false;

LNode *q = p->next;//另q结点指向被删除的节点

e = q->data;//用e返回元素的值

p->next = q->next;//将*q结点从链中断开

free(q);

return true;

}

//删除指定结点

bool DeleteNode(LNode *p){

if(p==NULL)

return false;

LNode *q = p->next;

p->data = p->next->data;

p->next = q->next;

free(q);

return true;

}

//后插操作:在p节点之后插入元素e

bool InsertNextNode(LNode *p, int e){

if(p == NULL)

return false;

LNode *s = (LNode *)malloc(sizeof(LNode));

if(s == NULL)

return false;

s->data = e;

s->next = p->next;

p->next = s;

return true;

}

int main(){

return 0;

}

双链表


#include

using namespace std;

typedef struct DNode{

int datal

struct DNode *prior, *next;

}DNode, *DLinkList;

bool InitDLinkList(DLinkList &L){

L = (DNode *) malloc(sizeof(DNode));

if(L == NULL)

return false;

L->prior = NULL;

L->next = NULL;

return true;

}

//在p结点之后插入s结点

bool InsertNextDNode(DNode *p, DNode *s){

if(pNULL || sNULL){

return false;

}

s->next = p->next;

if(p->next != NULL){

p->next->prior = s;

}

s->prior = p;

p->next = s;

}

//删除p结点的后继结点

bool DeleteNextDNode(DNode *p){

if(p==NULL) return false;

DNode *q = p->next;

if(q==NULL) return false;

p->next = q->next;

if(q->next !=NULL)

q->next->prior = p;

free(q);

return true;

}

循环链表


//循环单链表

#include

using namespace std;

typedef struct LNode{

int data;

struct LNode *next;

}LNode ,*LinkList;

//初始化一个循环单链表

bool InitList(LinkList &L){

L = (LNode *)malloc(sizeof(LNode));

if(L==NULL)

return false;

L->next = L;

return true;

}

//判断循环单链表是否为空

bool Empty(LinkList L){

if(L->next == L)

return true;

else

return false;

}

int main(){

return 0;

}

//循环双链表

#include <bits/stdc++.h>

using namespace std;

typedef struct DNode{

int data;

struct DNode *prior, *next;

}DNode, *DLinkList;

//初始化空的循环双链表

bool InitDLinkList(DLinkList &L){

L = (DNode *)malloc(sizeof(DNode));

if(L == NULL)

return false;

L->prior = L;
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

那么如何才能正确的掌握Redis呢?

为了让大家能够在Redis上能够加深,所以这次给大家准备了一些Redis的学习资料,还有一些大厂的面试题,包括以下这些面试题

  • 并发编程面试题汇总

  • JVM面试题汇总

  • Netty常被问到的那些面试题汇总

  • Tomcat面试题整理汇总

  • Mysql面试题汇总

  • Spring源码深度解析

  • Mybatis常见面试题汇总

  • Nginx那些面试题汇总

  • Zookeeper面试题汇总

  • RabbitMQ常见面试题汇总

JVM常频面试:

Redis高频面试笔记:基础+缓存雪崩+哨兵+集群+Reids场景设计

Mysql面试题汇总(一)

Redis高频面试笔记:基础+缓存雪崩+哨兵+集群+Reids场景设计

Mysql面试题汇总(二)

Redis高频面试笔记:基础+缓存雪崩+哨兵+集群+Reids场景设计

Redis常见面试题汇总(300+题)

Redis高频面试笔记:基础+缓存雪崩+哨兵+集群+Reids场景设计
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
以这次给大家准备了一些Redis的学习资料,还有一些大厂的面试题,包括以下这些面试题

  • 并发编程面试题汇总

  • JVM面试题汇总

  • Netty常被问到的那些面试题汇总

  • Tomcat面试题整理汇总

  • Mysql面试题汇总

  • Spring源码深度解析

  • Mybatis常见面试题汇总

  • Nginx那些面试题汇总

  • Zookeeper面试题汇总

  • RabbitMQ常见面试题汇总

JVM常频面试:

[外链图片转存中…(img-0dHzj96S-1713714177344)]

Mysql面试题汇总(一)

[外链图片转存中…(img-b3EtHm3G-1713714177344)]

Mysql面试题汇总(二)

[外链图片转存中…(img-SIdMdSO2-1713714177344)]

Redis常见面试题汇总(300+题)

[外链图片转存中…(img-YFnByA2e-1713714177344)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 30
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值