目录
- 【线性表】
-
- 建立一个静态顺序表(正序),并输出该线性表。
- 建立一个静态顺序表(逆序),输出该线性表;再在表的中部添加一个新元素,并输出新的线性表。
- 建立一个静态顺序表(逆序),输出该线性表;然后依次删除表尾元素、表头元素、表的中部元素,并分别输出新的线性表。
- 建立一个动态顺序表(正序),输出该线性表;再在表的中部添加一个新元素,并输出新的线性表。
- 建立一个动态顺序表,输出该线性表;然后依次删除表头元素、表尾元素、表的中部元素,并分别输出新的线性表。
- 合并两个有序动态顺序表LA和LB,生成一个新的有序顺序表LC,并输出该顺序表LC。
- 构造一个单链表,分别实现在表头、表中插入新元素的操作,并输出该单链表。
- 构造一个单链表,分别实现删除表头元素、表尾元素、表中元素的操作,并将删除相关元素后的单链表逆置,输出相应的操作结果。
- 构造两个有序单链表LA和LB,将这两个单链表进行合并,生成一个新的有序单链表LC,并输出。
- 构建一个线性链表,实现顺序查找、修改某元素的操作,并输出结果。
- 构建一个单链表,将该链表中的重复元素删除,并输出结果。
- 构建两个线性链表LA和LB,分别表示两个集合A和B,求其差集A-B,并输出结果。
- 按照正序方式构建一个循环链表,并输出该表中的元素及该表的表长。
- 按照正序方式构建一个双向循环链表,实现删除元素操作,并输出该表中的元素及该表的表长。
- 【栈和队列】
-
- 构造一个顺序栈(当输入9999时,结束入栈操作),实现输出栈中元素,显示栈顶元素,删除栈顶元素等操作。
- 构造一个链式栈(当输入9999时,结束入栈操作),实现输出栈中元素,显示栈顶元素,删除栈顶元素等操作。
- 使用单链表完成两个多项式的相加运算。首先构造两个单链表,分别表示两个多项式(升幂方式),然后进行相加操作,并输出结果(分别按照简易方式、格式化方式输出)。
- 基于栈(顺序栈或链栈均可)的数制转换功能,将一个大于等于零的十进制整数转换为二进制数。
- 创建一个循环队列,实现入队、出队、取队头元素、输出队列元素等操作。
- 算术表达式求值, 要求运算数为正整数(可以多位),可进行四则运算。
- 创建一个链队列,实现入队、出队、取队头元素、输出队列元素等操作。
- 【串】
【线性表】
建立一个静态顺序表(正序),并输出该线性表。
提示:完整的程序包括程序前缀、静态顺序表的结构体类型定义、初始化子函数、表尾插入新元素子函数、输出子函数、主函数等。
#include<iostream>
#include<stdio.h>
using namespace std;
#define LIST_INIT_SIZE 100
//结构体类型定义
struct StaticList {
int elem[LIST_INIT_SIZE]; //表
int length; //表长
int listsize; //表有可能的最大长度
} ;
//初始化
void InitList_StaticList(StaticList &L) {
L.length=0;
L.listsize=LIST_INIT_SIZE;
}
//表尾插入新元素
int Ins_SList(StaticList &L,int x) {
if(L.length>=L.listsize) {
printf ("The list is overflow ! \n");
return -1;
}
else {
L.elem[L.length]=x;
L.length++;
return 1;
}
}
//输出线性表
void print(StaticList &L) {
for(int i=0; i<=L.length-1 ; i++)
cout<<L.elem[i]<<" "; //输出
cout<<endl;
}
int main(int argc,char* argv[]) {
StaticList SL;
InitList_StaticList(SL);
cout<<"enter numbers:"<<endl;
while(1) {
int x;
cin>>x; //输入
if(x==9999)
break; //当输入9999时停止输入
else
Ins_SList(SL, x);
}
cout<<"The list elems:"<<endl ;
print(SL);
return 0;
}
建立一个静态顺序表(逆序),输出该线性表;再在表的中部添加一个新元素,并输出新的线性表。
提示:完整的程序包括程序前缀、静态顺序表的结构体类型定义、初始化子函数、表头插入新元素子函数、表中插入新元素子函数、输出子函数、主函数等。
#include<iostream>
using namespace std;
#define LIST_INIT_SIZE 100
//结构体类型定义
struct StaticList {
int elem[LIST_INIT_SIZE];
int length;
int listsize;
};
//初始化
void InitList_StaticList(StaticList &L) {
L.length=0;
L.listsize=LIST_INIT_SIZE;
}
//在表头插入新元素x
int Ins_SList1(StaticList &L, int x) {
//顺序表已满(没有多余空间),返回-1,表示插入失败
if(L.length>=L.listsize) {
printf("The list is overflow ! \n ");
return -1;
} else {
for (int i=L.length-1 ; i>=0; i--) {
//下标[0, length-1]的元素逐个后移
L.elem[i+1]=L.elem[i];
}
L.elem[0]=x;
L.length++;
return 1 ;
}
}
//在线性表中下标为i(第i+1个位置)的位置插入数据x
int Ins_SList2(StaticList &L, int i, int x) {
//顺序表已满(没有多余空间),返回-1,表示插入失败
if(L.length>=L.listsize) {
printf ("The list is overflow ! \n") ;
return -1;
} else if (i<0 || i>L.length) {
//当i=L.length时即插入位置为表的最后
printf ("The position is error ! \n") ;
return 0;
} else {
// i>=0 && i<=L.length
for (int j=L.length-1; j>=i; j--) {
//下标[i, length-1]的元素逐个后移
L.elem[j+1]=L.elem[j];
}
L.elem[i]=x ;
L.length++;
return 1 ;
}
}
//输出
void print(StaticList &L) {
for(int i=0; i<=L.length-1; i++) {
cout<<L.elem[i]<<" ";
}
cout<<endl;
}
int main(int argc, char* argv[]) {
StaticList SL;
int num, pos;
//初始化函数
InitList_StaticList(SL) ;
cout<<"enter numbers:"<<endl;
while(1) {
int x;
cin>>x;
if(x==9999)
break;
else
Ins_SList1(SL, x);
}
//输出元素
cout<<"The list elems:"<<endl ;
print(SL);
//输入插入元素
cout<<"insert a new element:"<<endl;
cin>>num;
//输入插入元素下标
cout<<"input the inserted position:"<<endl;
cin>>pos;
//插入元素函数
Ins_SList2(SL, pos-1, num);
//输出最终表内元素
cout<<"The new list elems:"<<endl ;
print(SL);
return 0;
}
建立一个静态顺序表(逆序),输出该线性表;然后依次删除表尾元素、表头元素、表的中部元素,并分别输出新的线性表。
提示:完整的程序包括程序前缀、静态顺序表的结构体类型定义、初始化子函数、表头插入新元素子函数、表尾删除元素子函数、表头删除元素子函数、表中删除元素子函数、输出子函数、主函数等。
#include<iostream>
using namespace std;
#define LIST_INIT_SIZE 100
//结构体类型定义
struct StaticList {
int elem[LIST_INIT_SIZE];
int length;
int listsize;
};
//初始化
void InitList_StaticList(StaticList &L) {
L. length=0;
L.listsize=LIST_INIT_SIZE;
}
//在表头插入新元素x
int Ins_SList1(StaticList &L,int x) {
//顺序表已满(没有多余空间),返回-1,表示插入失败
if(L.length>=L.listsize) {
printf("The list is overflow ! \n ");
return -1;
} else
for (int i=L.length-1; i>=0; i--) {
L.elem[i+1]=L.elem[i];//下标[0, length-1]的元素逐个后移
}
L.elem[0]=x;
L.length++;
return 1;
}
//输出
void print(StaticList &L) {
for(int i=0; i<=L.length-1 ; i++) {
cout<<L.elem[i]<<" ";
}
cout<<endl;
cout<<endl;
}
//删除表尾元素
int Del_SList2(StaticList &L) {
//顺序表为空(没有元素可删),返回-1,删除失败
if(L.length==0) {
printf("The list is empty ! \n");
return -1 ;
} else {
L.length--;
return 1 ;
}
}
//删除表头元素,第1个元素,下标为0
int Del_SList1(StaticList &L) {
//顺序表为空(没有元素可删),返回-1,删除失败
if(L.length==0) {
printf("The list is empty ! \n") ;
return -1;
} else {
//数据由后往前移动
for(int i=1; i<=L.length-1 ; i++) {
L.elem[i-1]=L.elem[i];
}
L.length--;
return 1;
}
}
//删除表中数组下标为i的元素,第i+1个元素
int Del_SList(StaticList &L, int i) {
//顺序表为空(没有元素可删),返回-1,删除失败
if(L.length==0) {
printf("The list is empty ! \n") ;
return -1;
} else if(i<0 || i>L.length-1) {
printf("The index is error ! \n");
return 0;
} else {
//i>=O && i<=L.length-1
for(int j=i+1; j<=L.length-1; j++) {
//下标[i+1, length-1]的元素逐个前移
L.elem[j-1]=L.elem[j];
}
L.length--;
return 1;
}
}
int main(int argc, char* argv[]) {
StaticList SL;
int num, pos;
InitList_StaticList(SL) ;
cout<<"enter numbers:"<<endl ;
while(1) {
int x;
cin>>x;
if(x==9999)
break ;
else
Ins_SList1 (SL,x) ;
}
cout<<"The list elems:"<<endl;
print(SL) ;
//删除表头元素
cout<<"delete the list_head element:" <<endl ;
Del_SList1(SL);
cout<<"The new list elems after deleting list_head element:"<<endl ;
print(SL);
//删除表尾元素
cout<<"delete the list_tail element:" <<endl;
Del_SList2(SL);
cout<<"The new list elems after deleting list_tail element:"<<endl ;
print(SL);
//删除表中间元素
cout<<"delete the list_middle element:" <<endl;
//输入删除元素的下标
cout<<"input the deleted position:"<<endl;
cin>>pos;
Del_SList(SL, pos-1) ;
cout<<"The new list elems:"<<endl ;
print(SL);
return 0;
}
建立一个动态顺序表(正序),输出该线性表;再在表的中部添加一个新元素,并输出新的线性表。
提示:完整的程序包括程序前缀、动态顺序表的结构体类型定义、初始化子函数、表头或表尾插入新元素子函数、表中插入新元素子函数、输出子函数、主函数等。
#include<iostream>
using namespace std;
typedef int ElemType;
#define LIST_INIT_SIZE 100
//结构体类型定义
typedef struct {
ElemType *elem;
int length;
int listsize;
} SqList; //SqList是结构体类型
//初始化,构造一个空的线性表
int InitList_Sq(SqList &L) {
/*
申请动态空间,申请 LIST_INIT_SIZE个 类型为ElemType 的空间。
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));是C语言的格式。
L.elem=new ElemType[LIST_INIT_SIZE];是C++的格式。
*/
L.elem = new ElemType[LIST_INIT_SIZE];
//申请动态空间未成功
if (L.elem==0) {
printf("failure! \n") ;
return 0;
} else {
L.length=0;
L.listsize=LIST_INIT_SIZE;
return 1 ;
}
}
//在表尾插入元素e
int ListEndInsert_Sq(SqList &L, ElemType e) {
if(L.length>=L.listsize) {
printf("overf1ow! \n");
return -1;
}
L.elem[L.length]=e;
L.length++;
return 1;
}
/*
L.elem[L.length]=e;为何用数组:
只使用数组的形式访问线性表中的一个元素而已,这点和指针类似。
比如char *p="abcdef",同样可以通过p[i]来访问字符串中的字符。
*/
//在动态顺序表L的第i个位置插入元素e
int ListInsert_Sq(SqList &L, int i, ElemType e) {
ElemType *p, *q;
//插入位置不合法
if(i<=0 || i>=L.length) {
printf("The position error! Not inserted! \n");
return 0;
}
//空间不足
if(L.length>=L.listsize) {
printf("overflow! \n") ;
return -1;
}
q=&(L.elem[i-1]);//第i个元素,下标为i-1
for(p=&(L.elem[L.length-1]); p>=q; --p) {
*(p+1)=*p;
}
*q=e; //插入新元素
L.length++; //表长递增
return 1;
}
//输出动态线性表元素
void printSq(SqList &L) {
ElemType *p;
for (p=&(L.elem[0]); p<=&(L.elem[L.length-1]); p++) {
cout<<*p<<" ";
}
cout<<endl;
}
int main(int argc, char* argv[]) {
SqList SSL;
int pos;
ElemType x;
InitList_Sq(SSL) ;
cout<<"enter numbers:"<<endl ;
while(1) {
cin>>x;
if(x==9999)
break ;
else
ListEndInsert_Sq(SSL,x);
}
cout<<"The list elems:"<<endl;
printSq(SSL);
cout<<"enter the inserted position:" <<endl;
cin>>pos;
cout<<"enter the inserted number x:"<<endl;
cin>>x ;
//ListInsert_Sq(SSL, pos,x);
if (ListInsert_Sq(SSL, pos, x)==1) {
cout<<"The new list elems:"<<endl;
printSq(SSL) ;
}
return 0;
}
建立一个动态顺序表,输出该线性表;然后依次删除表头元素、表尾元素、表的中部元素,并分别输出新的线性表。
提示:完整的程序包括程序前缀、动态顺序表的结构体类型定义、初始化子函数、表头或表尾插入新元素子函数、表头删除元素子函数、表尾删除元素子函数、表中删除元素子函数、输出子函数、主函数等。
#include<iostream>
using namespace std;
typedef int ElemType;
#define LIST_INIT_SIZE 100
//结构体类型定义
typedef struct {
ElemType*elem;
int length;
int listsize;
} SqList;
//初始化
int InitList_Sq(SqList &L) {
//申请动态空间
L.elem=new ElemType[LIST_INIT_SIZE];
//申请动态空间未成功
if (L.elem==0) {
printf ("error \n");
return 0;
} else {
L.length=0;
L.listsize=LIST_INIT_SIZE;
return 1 ;
}
}
//在表尾插入数据
int ListEndInsert_Sq(SqList &L, ElemType e) {
if (L.length==L.listsize) {
printf("overflow! \n") ;
return -1;
}
L.elem[L.length]=e;
L.length++;
return 1 ;
}
//删除表头数据元素
int DelHeadList_Sq(SqList &L) {
ElemType *p;
if (L.length==0) {
printf("UNDERFLOW! \n");
return -1;
} else {
for(p=&(L.elem[1]); p<=&(L.elem[L.length-1]); p++) {
*(p-1)=*p;
}
L.length--;
return 1 ;
}
}
//删除表尾数据元素
int DelEndList_Sq(SqList &L) {
if(L.length==0) {
printf("UNDERFLOW! \n");
return -1 ;
} else {
L.length--;
return 1 ;
}
}
//删除第i个元素
int DelList_Sq(SqList &L, int i) {
ElemType *p;
//溢出
if (L.length==0) {
printf("UNDERFLOW! \n");
return -1;
}
//删除位置不合法
else if (i<=0 || i>L.length) {
printf("The position error! Not deleted! \n");
return 0;
} else {
for (p=&(L.elem[i]); p<=&(L.elem[L.length-1]); p++) {
*(p-1)=*p ;
}
L.length--;
return 1 ;
}
}
//输出动态线性表元素
void printSq(SqList &L) {
ElemType *p;
for (p=&(L.elem[0]); p<=&(L.elem[L.length-1]); p++) {
cout<<*p<<" ";
}
cout<<endl;
}
int main(int argc, char* argv[]) {
SqList SSL;//定义结构体变量SSL
int pos, x;
InitList_Sq(SSL); //初始化线性表
cout<<"enter numbers:"<<endl;
while(1) {
cin>>x;
if(x==9999)
break;
else {
ListEndInsert_Sq(SSL, x);//构造一个线性表
}
}
cout<<"The list elems:"<<endl;
printSq(SSL);
cout<<"delete the head elem:"<<endl;
//删除表头元素
DelHeadList_Sq(SSL);
cout<<"The new deleted list elems:"<<endl;
printSq(SSL);
//删除表尾元素
cout<<"delete the tail elem: "<<endl;
DelEndList_Sq(SSL);
cout<<"The new de1eted 1ist elems:"<<endl;
printSq(SSL);
cout<<"enter the deleted position: "<<endl;
cin>>pos;
//De1List_sq(SSL, pos); //删除第i个数据元素
if (DelList_Sq(SSL, pos)==1) {
cout<<"The new deleted list elems:"<<endl;
printSq(SSL);
}
return 0;
}
合并两个有序动态顺序表LA和LB,生成一个新的有序顺序表LC,并输出该顺序表LC。
提示:完整的程序包括程序前缀、动态顺序表的结构体类型定义、初始化子函数(可选)、表尾插入新元素子函数、合并有序顺序表子函数、输出子函数、主函数等。
#include<iostream>
using namespace std;
typedef int ElemType;
//结构体类型定义
struct SqList {
ElemType *elem;
int listsize;
int length;
};
void InputData(SqList &LA);
void MergeList_Sq(SqList LA, SqList LB, SqList &LC);
void print(SqList LC);
int main(int argc, char* argv[]) {
SqList LA, LB, LC;
//初始化顺序表LA
LA.elem=new ElemType[100];
LA.length=0;
LA.listsize=100;
//初始化顺序表LB
LB.elem=new ElemType[100];
LB.length=0;
LB.listsize=100;
cout<<"创建LA表,请按升序输入整数,以9999结束:"<<endl;
InputData(LA) ;
cout<<"输出LA表:"<<endl;
print(LA);
cout<<endl;
cout<<"创建LB表,请按升序输入整数,以9999结束:"<<endl;
InputData(LB);
cout<<"输出LB表:"<<endl;
print(LB);
cout<<endl;
cout<<"合并LA表和LB表,生成LC表:"<<endl;
MergeList_Sq(LA, LB, LC);
cout<<"输出LC表:"<<endl;
print(LC);
return 0;
}
//构造升序排列的顺序表
void InputData(SqList &LA) {
ElemType num;
for(int i=0; ; i++) {
cin>>num;
if (num!=9999) {
LA.elem[i]=num;
LA.length++;
} else
break;
}
}
//输出
void print(SqList LC) {
for(int i=0; i<LC.length; i++)
cout<<LC.elem[i]<<" ";
cout<<endl;
}
//LA、LB中的元素为升序,合并后的LC也为升序
void MergeList_Sq(SqList LA, SqList LB, SqList &LC) {
int i, j, k ;
i=j=k=0;
//初始化顺序表LC
LC.length=LA.length + LB.length;
LC.listsize=LA.listsize + LB.listsize;
LC.elem=new ElemType[LC.listsize];
//当LA、LB同时不为空时,进行下面操作
while(i<=LA.length-1 && j<=LB.length-1) {
//取LA的第i+1个元素,下标为i
ElemType pa=LA.elem[i];
//取LB的第j+1个元素,下标为i
ElemType pb=LB.elem[j];
if (pa<=pb) {
LC.elem[k]=pa; //pa插入LC尾部
k++; //LC下标后移
i++; //LA下标后移
} else {
LC.elem[k]=pb;
k++; //LC下标后移
j++; //LB下标后移
}
//如果LA中还有元素,则所有元素全部插入LC尾部
while(i<=LA.length-1) {
ElemType pa=LA.elem[i];
LC.elem[k]=pa;
k++;
i++;
}
//如果LB中还有元素,则所有元素全部插入LC尾部
while(j<=LB.length-1) {
ElemType pb=LB.elem[j];
LC.elem[k]=pb;
k++;
j++;
}
}
}
构造一个单链表,分别实现在表头、表中插入新元素的操作,并输出该单链表。
提示:完整的程序包括程序前缀、单链表的结构体类型定义、表尾插入新元素子函数、表头插入新元素子函数、表中插入新元素子函数、求链表表长子函数、输出子函数、主函数等。
#include <iostream>
using namespace std;
typedef int ElemType;
//结构体类型定义
struct LinkNode {
ElemType data;
struct LinkNode *next;
};
//输出
//将链表L中的数据输出到屏幕上,其中L指向头结点
void print(LinkNode* L) {
LinkNode *p; //定义一个指针变量
p=L->next; //让p指向链表L的第一个数据
while(p!=0) {
cout<<p->data<<" "; //输出数据到屏幕上
p=p->next; //指针后移
}
cout<<endl;
}
//在以H为头指针的单链表表尾插入一个数据x
//&可以去掉
void Insert_tail(LinkNode*&H, ElemType x) {
LinkNode *t,*p; //定义指针
t=new LinkNode; //申请新结点空间
t->data=x; //向新结点中写入数据
t->next=0; //把空地址写入新结点中
p=H;