02——线性表

server/2024/9/25 17:19:04/

线性表

基本操作

Initlist(&L):初始化表
Length(L):求表长
LocateElem(L,e):按值查找操作
GetElem(L,i):按位查找操作
ListInsert(&L,i,e):插入操作
ListDelete(&L,i,&e):删除操作
PrintList(L):输出操作
Empty(L):判空操作
DestroyList(&L):销毁操作

顺序表

静态分配的顺序表存储结构

#define Maxsize 50
typedef struct{ElemType data[Maxsize];int length;
}SqList;

动态分配的顺序表存储结构

#define InitSize 100
typedef struct{ElemType *data;int Maxsize,length;
}SeqList;
L.data=(ElemType*)malloc(sizeof(ElemType)*InitSize);或
L.data=new ElemType[InitSize];

增加动态数组的长度 

#include <stdlib.h>
#define InitSize 10
typedef struct{int *data;int Maxsize,length;
}SeqList;int main(){SeqList L;IniList(L);...IncreaseSize(L,5);return 0;
}//初始化一个动态数组
void InitList(SeqList &L){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<L.length;i++){L.data[i]=p[i];//注意访问p指针指向的数组}L.MaxSize=L.MaxSize+len;free (p);
}

静态分配顺序表的初始化

void InitList(SqList &L){for(int i=0;i<MaxSize;i++){L.data[i]=0;}L.length=0;
}
或者
void InitList(sqList &L){L.length=0;
}

动态分配顺序表的初始化

void InitList(SeqList &L){L.data=(ElemType*)malloc(InitSize*sizeof(ElemType));L.length=0;L.MaxSize=InitSize;
}

插入操作(位置在1~L.length+1之间)

bool ListInsert(SqList &L,int i,ElemType e){if(i<1||i>L.length+1)return false;if(L.length>=MaxSize)//存储空间满return false;for(int j=L.length;j>=i;j--)L.data[j]=L.data[j-1];//第i个元素后的元素后移L.data[i-1]=e;L.length++;return true;
}

删除操作(位置在1~L.length之间)

bool ListDelete(SqList &L,int i,ElemType &e){if(i<1||i>L.length) return false;e=L.data[i-1];for(int j=i;j<L.length;j--)L.data[j-1]=L.data[j];//第i个元素后的元素前移L.length--;return true;
}

按值查找

int LocateElem(SqList L,ElemType e){int i;for(i=0;i<L.length;i++)//若为i<InitSize,则初始化要全部初始化为0,防止脏数据影响if(L.data[i]==e)  return i+1;//返回位序i+1return 0;
}

按位查找(静态分配和动态分配一样)

ElemType GetElem(SqList L,int i){return L.data[i-1];
}
补充:结构体的比较不能直接用==,应该一个一个元素比较。

链表

单链表

单链表节点结构

typedef struct LNode{ElemType data;struct LNode *next;
}LNode,*LinkList;
相当于
struct LNode{ElemType data;struct LNode *next;
};
typedef struct LNode LNode;
typedef struct LNode *LinkList;LNode *L;//表明这是一个指向单链表第一个结点的指针,强调结点
LinkList L;//同上,更强调链表

单链表的初始化及判空(带头结点)

bool InitList(LinkList &L){L=(LNode*)malloc(sizeof(LNode));//分配第一个头结点if(L==NULL) return false; //内存不足,分配失败L->next=NULL;return true;
}bool Empty(LinkList L){if(L->next==NULL) return true;else return false;
}

单链表的初始化及判空(不带头结点)

bool InitList(LinkList &L){L=NULL;return true;
}bool Empty(LinkList L){if(L==NULL) return true;else return false;
}
或者
bool Empty(LinkList L){return (L==NULL):
}

求表长操作(带头结点)

int length(LinkList L){int len=0;//计数变量LNode* p=L;while(p->next!=NULL){p=p->next;len++;}return len;
}

按序号查找

LNode* GetElem(LinkList L,int i){if(i<0) return NULL;LNode *p=L;int j=0;//记录当前结点的位序,头结点为第0个结点,方便把结点插在第1个位置while(p!=NULL&&j<i){p=p->next;j++;}return p;//返回指向第i个结点的指针或NULL
}

按值查找

LNode *LocateElem(LinkList L,ElemType e){LNode *p=L->next;while(p!=NULL&&p->data!=e){p=p->next;}return p;//找到则返回该结点指针,否则返回NULL
}

按位序插入(带头结点)

bool ListInsert(LinkList &L,int i,ElemType e){if(i<1) return false;LNode *p=L;int j=0;//头结点是第0个结点while(p!=NULL&&j<i-1){//找到第i-1个结点p=p->next;j++;}if(p==NULL) return false;//i值不合法LNode *s=(LNode*)malloc(sizeof(LNode));s->data=e;s->next=p->next;p->next=s;return true;
}

按位序插入(不带头结点)

bool ListInsert(LinkList &L,int i,ElemType e){if(i<1) return false;if(i==1){//仅第1一个结点与带头结点的操作不同LNode *s=(LNode*)malloc(sizeof(LNode));s->data=e;s->next=L;L=s;return true;}LNode *p=L;int j=1;//没有头结点了while(p!=NULL&&j<i-1){//找到第i-1个结点p=p->next;j++;}if(p==NULL) return false;//i值不合法LNode *s=(LNode*)malloc(sizeof(LNode));s->data=e;s->next=p->next;p->next=s;return true;
}

指定结点的后插操作 

bool InsertNextNode(LNode *p,ElemType e){//在p结点之后插入元素eif(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;
}

指定结点的前插操作

bool InsertPriorNode(LNode *p,ElemType 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->data=e;return true;
}

按位序删除(带头结点)

 


http://www.ppmy.cn/server/35029.html

相关文章

C++手写协程项目(协程实现线程结构体、线程调度器定义,线程挂起函数、线程切换函数、线程恢复函数、线程结束函数、线程结束判断函数,模块测试)

协程结构体定义 之前我们使用linux下协程函数实现了线程切换&#xff0c;使用的是ucontext_t结构体&#xff0c;和基于这个结构体的四个函数。现在我们要用这些工具来实现我们自己的一个线程结构体&#xff0c;并实现线程调度和线程切换、挂起。 首先我们来实现以下线程结构体…

记录下搭高可用集群中Hadoop的几个配置

不断补充中... DataNode的配置&#xff1a; 假设我有5台服务器&#xff0c;分别是hadoop100-104&#xff0c;我现在需要在100和101上配置NameNode&#xff0c;在102-104上配DataNode&#xff0c;我需要在我的workers文件中增加如下内容 [atguiguhadoop102 hadoop]$ vim /opt…

2023 年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷 B(容器云)

#需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包…

什么是高级持续威胁(APT)

高级持续性威胁&#xff08;Advanced Persistent Threat&#xff0c;APT&#xff09;&#xff0c;又叫高级长期威胁&#xff0c;是一种复杂的、持续的网络攻击&#xff0c;包含三个要素&#xff1a;高级、长期、威胁。 【高级】是指执行APT攻击需要比传统攻击更高的定制程度和…

代码随想录算法训练营第十三天:树的认知(补五一)

代码随想录算法训练营第十三天&#xff1a;树的认知&#xff08;补五一&#xff09; ‍ 二叉树的递归遍历 #算法公开课 《代码随想录》算法视频公开课 ****(opens new window)****​ &#xff1a;​每次写递归都要靠直觉&#xff1f; 这次带你学透二叉树的递归遍历&#xf…

C++11,{}初始化,initializer_list,decltype,右值引用,类和对象的补充

c98是C标准委员会成立第一年的C标准&#xff0c;C的第一次更新是C03&#xff0c;但由于C03基本上是对C98缺陷的修正&#xff0c;所以一般把C98与C03合并起来&#xff0c;叫做C98/03&#xff1b; 后来原本C委员会更新的速度预计是5年更新一次&#xff0c;但由于C标准委员会的进…

从VPS切换到云服务器的几大理由

有很多文章比较VPS和云服务器&#xff0c;选择哪种解决方案来提供最佳效率。尽管很多人仍在使用VPS&#xff0c;但其中许多人已对云服务器拥有简单的认知&#xff0c;且已有意图从VPS迁移到云服务器。然而在这样做之前&#xff0c;您需要更加深入了解云服务器&#xff0c;它的优…

GridCtrl成员函数及功能简要说明

一、特点&#xff1a; ● 使用鼠标可以进行单元格的选择&#xff0c;还可以辅助ctrl和shift的组合键进行选择。也可以取消选择。 ● 行和列可以按照大小进行重排&#xff0c;还可以取消对行、列或两者的排序。 ● 双击区分点&#xff0c;行或者列可以按照大小自动排序 ● 可以对…