(a1,a2,...an)
1)初始化函数:void intList(List&L)
先决条件:线性表L不存在
操作结果:构造一个空的线性表L
2)清空函数:void clearList(List&L)
先决条件:线性表L已经存在
操作结果:将线性表L清空
3)计算表长函数:int Length(List&L)
先决条件:线性表L已经存在
操作结果:返回第i个元素的位置
4)定位函数:position Locate(List&L,int i)
先决条件:线性表L存在且整数i属于[1,n]
操作结果:返回第i个元素的位置
5)查找函数:position Search(List&L,DateType x)
先决条件:线性表L已经存在,且x的数据类型与表元素的数据类型相同
操作结果:线性表中查找与x匹配的元素,查找成功返回元素位置,失败返回失败位置
6)插入函数:bool Insert(List&L,int i,DateType x)
先决条件:线性表L存在,且整数i属于[1,n+1],且x的数据类型与表中相同
操作结果:将元素x插入线性表L第i个位置。函数返回插入成功与否的标志。
7)删除函数:bool Remove(List&L,int i,DateType&x)
先决条件:线性表L存在,且整数i属于[1,n]
操作结果:从线性表中移除第i个元素。删除成功则通过引用型参数x得到删除值,函数返回删除成功的标志。
8)遍历函数:void Traverse(List&L)
先决条件:线性表L已经存在。
操作结果:依次访问线性表L中所有元素,且仅访问一次
9)复制函数:void Copy(List&L1,List&L2)
先决条件:线性表L1和L2已存在,且L1为空
操作结果:复制L2所有元素到L1
10)排序函数:void Sort(List&L)
先决条件:线性表L存在
操作结果:对线性表中所有元素L排序。
#include
#include
#define maxSize 100 //顺序表存储的最大容量
typedef int DataType;//每个元素的数据类型
typedef struct{
DataType data[maxSize];//线性表的存储数组
int n;//数组中当前已有表的元素数
}SeqList;//创建一个新表
//定义在SeqList.cpp
#include
#include
#define intSize 30//表的初始大小
typedef int DataType;//预设表的元素数据类型
typedef struct {
DataType *data;//元素存储向量的指针
int maxSize,n;//表的最大长度和当前元素个数
}SeqList;
#include "SeqList.h"
#include
#include
//1、初始化顺序表
void intList(SeqList&L){
L.data=(DataType*)malloc(initSize*sizeof(DataType));//创建存储数组
if(!L.data){
printf("存储分配错误!\n");//分配失败
}
L.maxSize=initSize;
L.n=0;//置表的实际长度为0
}
//2、清空顺序表
void clearList(SeqList&L){
L.n=0;
}
//3、计算顺序表长度
int Length(SeqList&L){
return L.n;
}
//4、盘表空否,空返回true,否则false
bool isEmppty(SeqList&L){
return L.n==0;
}
//5、判断满否,满返回true,否则false
bool isFull(SeqList&L){
return L.n==L.maxSize;
}
//6、从数组A[n]创建顺序表。存储分配失败返回false,否则true
bool creatList(SeqList&L,DataType A[],int n){
L.data=(DataType*)malloc(initSize*sizeof(DataType));//创建存储数组
if(!L.data)
return false;//分配失败
for(int i=0;i0&&i<=L.n) return i-1; //i合法返回i-1
else return -1;//定位失败,返回-1
}
//9、将新元素插入表中第i个元素,若成功返回true,否则false
bool Insert(SeqList&L,int i,DataType x){
if(L.n==L.maxSize) return false;//表满,不能插入
if(i<=0||i>L.n+1) return false;//参数i不合理
for(int j=L.n-1;j>=i-1;j--)L.data[j+1]=L.data[j];//依次后裔,空出第i号位置
L.data[i-1]=x; L.n++;//插入,表长度+1
return true;
}
//10、删除顺序表第i个元素,通过引用参数x返回删除元素的值。删除成功返回true,否则false
bool Remove(SeqList&L,int i,DataType x){
if(!L.n) return false;//表空,不能删除
if(i<=0||i>L.n) return false;//参数i不合理,不能删除
x=L.data[i-1];//存储被删除的元素值
for(int j=i;j
#include"List.h"
#include
#include
//1、集合的并运算
void Merge(SeqList&LA,SeqList&LB){
DataType x;
int n=Length(LA);
int m=Length(LB);
int i,k;
for(i=0;i
单链表是线性表的链接存储表示。单链表为数据元素附加了一个链接指针并形成一个一个的结点。结点由data(数据域,存放数据元素)和link(指针域/链域,存放用于记录下一个结点开始存储地址的指针)组成。链表的首元结点地址通过头指针first找到,其余存储在前驱节点的link域中。链表最后一个结点link域中存放空指针NULL。遍历链表时必须根据头指针找到首元节点。
#include
#include
typedef int DataType;//表中元素数据类型定义
typedef struct node{
DataType data;//结点保存的元素数据
struct node*link;//连接指针
}LinkNode ,*LinkList;
单链表中插入算法有三种
newNode->link=first;
first=newNode;
newNode->link=p->link;
p->link=newNode;
newNode->link=p->link;
p->link=newNode;
#include"LinkList.h"
#include
#include
bool Insert(LinkList&first,int i,DataType x){
//将新元素x插入到第i个结点的位置。i从1开始,若i=1插入到原首结点之前
//若i的值过大,插入到链尾,函数返回成功与否标志。
if(first==NULL||i==1){//插入到空表/非空表首元节点前
LinkNode*newNode=(LinkNode*)malloc(sizeof(LinkNode));//建立新节点
newNode->data=x;
newNode->link=first; first=newNode;//新结点成为首元结点
}
else{//插入到链表中间或者尾部
LinkNode*p=first,*pr; int k=1;//从首元结点开始检测
while(p!=NULL&&klink;k++;
}
if(p==NULL&&first!=NULL)p=pr;//链太短,p回到表尾
LinkNode*newNode=(LinkNode*)malloc(sizeof(LinkNode));//建立新结点
newNode->data=x;
newNode->link=p->link; p->link=newNode;//插入到*p之后
}
return true;//正常插入
}
根据删除位置不同有两种情况
q=first;
first=first->link;
free(q);
q=p->link;
p->link=q->link;
free(q);
#include"Linklist.h"
#include
#include
bool Remove(LinkList&first,int i,DataType x){
//将链表中的第i个元素删除,i从1开始,x返回被删除的元素值
LinkNode*p,*q; int k;
if(i==0){
printf("%d是无效位置!\n",i);
return false;
}
else if(i==1){//删除首元结点时表头退到下一位
q=first;
first=first->link;
free(q);
}
else{//删除中间结点
p=first; k=1;
while(p!=NULL&&klink;
k++;
}
if(p==NULL||p->link==NULL){
printf("%d是无效位置!\n",i);
return false;
}//空表或者链太短
q=p->link;
p->link=q->link;
}
x=q->data; free(q);//取出被删除结点中数据值
return true;
}
//1、初始化单链表,建立只有头结点的空链表
void initList(LinkList&first){
first=(LinkNode*)malloc(sizeof(LinkNode));//创建头结点
first->link=NULL;//置空
}
//2、清空单链表仅保留链表的头结点
void clearList(LinkList&first){
LinkNode*p;
while(first->link!=NULL){
LinkNode*q=first->link; first->link=q->link;//当链不空时,删去链中所有结点,仅保留头结点
free(q);
}
}
//3、计算表的长度,函数返回表的长度
int Length(LinkList&first){
LinkNode*p=first->link; int count=0;
while(p!=NULL){
p=p->link;
count++;//循链扫描,计算结点数
}
}
//4、在单链表中查找x元素,成功则返回地址值否则返回NULL
LinkNode*Search(LinkList&first,DataType x){
LinkNode*p=first->link;
while(p!=NULL&&p->data!=x)p=p->link;//循环逐个找含x结点
return p;
}
//5、对第i个结点定位。函数返回i的地址,若i<0或超出结点个数,则返回NULL
LinkNode*Locate(LinkList&first,int i){
if(i<0)return NULL;
LinkNode*p=first; int k=0;
while(p!=NULL&&klink;
k++;//循链找第i个结点,k做结点计数
}
return p;//若返回NULL,i过大
}
//6、将新元素x插入表中第i个结点的位置,函数返回插入成功与否标志
bool Insert(LinkList&first,int i, DataType x){
LinkNode*p=Locate(first,i-1);//定位于第i-1个结点
if(p==NULL)return false;
LinkNode*s=(LinkNode*)malloc(sizeof(LinkNode));
s->data=x; s->link=p->link; p->link=s; //将*s链接到*p之后
return true;
}
//7、将链表中第i个元素删去,引用参数x返回元素值。函数返回删除成功与否的标志
bool Remove(LinkList&first,int i,DataType&x){
LinkNode*p=Locate(first,i-1);//定位于第i-1个结点
if(p==NULL||p->link==NULL)return false;
LinkNode*q=p->link;
p->link=q->link;
x=q->data; free(q);
return true;
}
//8、输出带头结点的单链表
void printList(LinkList&first){
LinkNode*p;
for(p=first->link;p!=NULL;p=p->link){
printf("%d",p->data);
}
printf("\n");
}