1. 这是p1list.h 自定义的头文件
//------Head files for list in chapter 2 --------------
#include
#include
#include
//预定义常量
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define GUARD -99
#define MAXLEN 255 //线性表(顺序表) 的最大长度
#define LIST_MAX_SIZE 50 //链表的最大长度
//函数结果的类型
typedefint Status;
typedefintElemType;
typedefstruct {
ElemType *elem;
int length;
intlistsize;
} SqList;
typedefstruct List {
intelem[MAXLEN];
int length;
} List;
typedef unsigned char SString[MAXLEN + 1];
typedefintElemType;
typedefstructLNode {
int data;
structLNode *next;
}LNode, *LinkList;
//---------- p1list.cpp ---------------------------------------------
void InitList(List &L); //* 此函数用于初始化一个保持增序的线性表L
void InitList0(List &L); //* 此函数用于初始化一个线性表L
voidprintList(List L);
voidcreateTwoLists(List &La, List &Lb);
void MergeList(List La, List Lb, List &Lc); //*TBD1* 将Lb 归并到La 表,形成新表Lc
void Union(List &La, List Lb); //*TBD2* 线性La 和Lb 分别表示两个集合,求新集合La =La U Lb( U" 并" 操作)
void ReverseList(List &L); //*TBD3* 将线性表L 逆转
void deleteall(List &L, int x, int y); //*TBD4* 从一给定的顺序表L 中删除元素值在x 和y 之间的所有元素(x
//--------- lottery.cpp ----------------------------------------------
void build(LinkList&L, int size); //*TBD1* 乙负责-初始化循环链表L
void display(LinkList L); //*TBD1* 甲负责-在屏幕上输出链表L 的内容
void select10(LinkList&L); //*TBD2* 乙负责-实现体育彩票(10选7)
void select36(LinkList&L); //*TBD2* 甲负责-实现体育彩票(36选7)
void freeList(LinkList&L); //*TBD3* 甲负责-释放初始化链表L 所使用的内存
void mainlottery(); //*TBD3* 乙负责-实现主函数
//--------- LinkedList.cpp --------------------------------------------
Status CreateList_L(LinkList&L, int n); //采用尾插法创建一个带头结点的长度为n 的单链表L Status CreateList_L_NoHead(LinkList&L, int n); //采用尾插法创建一个无头结点的长度为n 的单链表L
void printList_L(LinkList L); //输出带头结点的单链表L
void printList_L_NoHead(LinkList L); //输出不带头结点的单链表L
Status GetElem_L(LinkList L, inti, ElemType&e);
Status ListInsert_L(LinkList&L, inti, ElemType e);
Status ListDelete_L(LinkList&L, inti, ElemType&e);
voidMergeList_L(LinkList&La, LinkList&Lb, LinkList&Lc);
voiddeleteallnodes(LinkList&L, ElemType min, ElemType max);
void ChangeLinkList01J(LinkList&L);
Status reorder5(LinkList&L);
//--------- p1list.cpp [例2-2-12] -----------------------------------
void deleteall_1(List *L, int x);
void deleteall_2(List *L, int x);
void deleteall_3(List *L, int x);
2. 这是线性表操作代码:
// 实验一:设计一个程序实现线性表上并操作。
// e1list.cpp : 定义控制台应用程序的入口点。
//
#include "p1list.h"
/* 此函数用于初始化一个保持增序的线性表L
* L的初值是通过键盘按照递增的次序一个自然数一个自然数输入的。
*/
void InitList(List &L) { //增序的;
inti=0,d;
L.elem[0]=GUARD; //-99
printf("\n输入某线性表各个元素的值(自然数) ,%d表示输入结束!\n", GUARD); do {
scanf("%d", &d);
if (d!=GUARD) {
if (i!=0 && d
printf("\n这里要初始化一个保持增序的线性表,请输入一个不小于的%d自然数",L.elem[i-1]);
elseL.elem[i++]=d;
}
}
if (i==MAXLEN) printf("\n该线性表长度达到最大值\n"); }while ((d!=GUARD)&&(i
/* 此函数用于初始化一个线性表L
* L的初值是通过键盘一个自然数一个自然数输入的。
*/
void InitList0(List &L) {
inti=0,d;
L.elem[0]=GUARD;
printf("输入某线性表各个元素的值(自然数) ,%d表示输入结束!\n", GUARD); do {
scanf("%d", &d);
if (d!=GUARD) L.elem[i++]=d;
if (i==MAXLEN) printf("\n该线性表长度达到最大值\n");
}while ((d!=GUARD)&&(i
L.length=i;
}
voidprintList(List L){
inti;
printf("线性表[%d]: \n", L.length);
for (i=0;i
printf("\n");
}
voidcreateTwoLists(List &La, List &Lb) {
}
printf("\n创建两个线性表--注意输入的两表的总长度不要超过%d\n",MAXLEN); InitList(La); //增序的 printf("\n初始化线性表Lb ,其长度不超过%d。超出部分被截断!\n", MAXLEN-La.length); InitList(Lb); if (La.length + Lb.length> MAXLEN) Lb.length=MAXLEN-La.length; //
/*TBD1* 将Lb 归并到La 表,形成新表Lc
*TBD1* 要求L0.c 保持有序,允许出现重复元素
*TB
D1*/
voidMergeList(List La, List Lb, List &Lc){
inti=0,j=0,m=0;
while(i
if(La.elem[i]>=Lb.elem[j])
Lc.elem[m++]=Lb.elem[j++];
elseLc.elem[m++]=La.elem[i++];
}
while(i
Lc.elem[m++]=La.elem[i++];
while(j
Lc.elem[m++]=Lb.elem[j++];
Lc.length=La.length+Lb.length;
}
/*TBD2* 线性La 和Lb 分别表示两个集合,求新集合La =La U Lb( U" 并" 操作) *TBD2* 注意集合里不允许出现重复元素
*TBD2*/
void Union(List &La, List Lb) {
inti=0,j=0,t,m=La.length; t=m;
while(i
if(La.elem[i]
i++;
}
else if(La.elem[i]==Lb.elem[j]){
i++;j++;
}
else {
}
}
} while(t>=i+1){ La.elem[t]=La.elem[t-1]; t--; } La.elem[i++]=Lb.elem[j++]; t=++La.length; while(j
/*TBD3* 将线性表L 逆转
*TBD3* 要求使用最少的附加空间,空间复杂度为O(1)。
*TBD3*/
voidReverseList(List &L) {
intj,i,n,c;
j=L.length-1;
n=L.length/2; //取半;
for(i=0;i
c=L.elem[i];
L.elem[i]=L.elem[j];
L.elem[j--]=c;
}
}
/*TBD4* 从一给定的顺序表L 中删除元素值在x 和y 之间的所有元素(x
*TBD4* 要求以较高的效率实现,空间复杂度为O(1)。
*TBD4*/
voiddeleteall(List &L, int x, int y) {
inti=0,n=0;
for(;i
if(L.elem[i]y) //机智啊把对的重新放一遍;
L.elem[n++]=L.elem[i];
}
L.length=n;
}
int main(intargc, char* argv[])
{
List La,Lb,Lc;
intx,y,n,h;
int j;
while(1){printf("\n1-创建数组La,Lb,2-合并数组La ,Lb 到Lc ,含重复元素3-归并Lb 到La ,不重复\n");
printf("4-逆转数组,5-删除数组中x-y 之间的值6-遍历La ,7-遍历Lb ,\n");
printf("输入大于7的数退出\n");
scanf("%d",&h);
// system("cls"); //盖住啦。。
switch(h){
case 1:{ createTwoLists(La,Lb);break;
}
case 2:{ MergeList(La,Lb,Lc);
printList(Lc);break;
}
case 3:{ Union(La,Lb);
printList(La);
break;}
case 4:{printf("逆转数组1-La 或2-Lb");
scanf("%d",&j);
if(j==1){
ReverseList(La);
printList(La);
}
else{
ReverseList(Lb);
printList(Lb);
}break;
}
case 5:{
printf("输入x,y, 顺序表L 中删除元素值在x 和y 之间的所有元素(x
scanf("%d",&x);
scanf("%d",&y);
printf("选择La 或Lb 表,1-La ,2-Lb");
scanf("%d",&n);
switch(n){
case 1: {deleteall(La,x,y);
printList(La);break;
}
case 2: {deleteall(Lb,x,y);
printList(Lb);break;
} }
break;
}
case 6:{ printList(La);break;
}
case 7:{ printList(Lb);break;
} } }//switch if(h>7) break; } //mainlottery(); printf("\n键入任意字符程序退出 ......"); getchar(); return 0;
1. 这是p1list.h 自定义的头文件
//------Head files for list in chapter 2 --------------
#include
#include
#include
//预定义常量
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define GUARD -99
#define MAXLEN 255 //线性表(顺序表) 的最大长度
#define LIST_MAX_SIZE 50 //链表的最大长度
//函数结果的类型
typedefint Status;
typedefintElemType;
typedefstruct {
ElemType *elem;
int length;
intlistsize;
} SqList;
typedefstruct List {
intelem[MAXLEN];
int length;
} List;
typedef unsigned char SString[MAXLEN + 1];
typedefintElemType;
typedefstructLNode {
int data;
structLNode *next;
}LNode, *LinkList;
//---------- p1list.cpp ---------------------------------------------
void InitList(List &L); //* 此函数用于初始化一个保持增序的线性表L
void InitList0(List &L); //* 此函数用于初始化一个线性表L
voidprintList(List L);
voidcreateTwoLists(List &La, List &Lb);
void MergeList(List La, List Lb, List &Lc); //*TBD1* 将Lb 归并到La 表,形成新表Lc
void Union(List &La, List Lb); //*TBD2* 线性La 和Lb 分别表示两个集合,求新集合La =La U Lb( U" 并" 操作)
void ReverseList(List &L); //*TBD3* 将线性表L 逆转
void deleteall(List &L, int x, int y); //*TBD4* 从一给定的顺序表L 中删除元素值在x 和y 之间的所有元素(x
//--------- lottery.cpp ----------------------------------------------
void build(LinkList&L, int size); //*TBD1* 乙负责-初始化循环链表L
void display(LinkList L); //*TBD1* 甲负责-在屏幕上输出链表L 的内容
void select10(LinkList&L); //*TBD2* 乙负责-实现体育彩票(10选7)
void select36(LinkList&L); //*TBD2* 甲负责-实现体育彩票(36选7)
void freeList(LinkList&L); //*TBD3* 甲负责-释放初始化链表L 所使用的内存
void mainlottery(); //*TBD3* 乙负责-实现主函数
//--------- LinkedList.cpp --------------------------------------------
Status CreateList_L(LinkList&L, int n); //采用尾插法创建一个带头结点的长度为n 的单链表L Status CreateList_L_NoHead(LinkList&L, int n); //采用尾插法创建一个无头结点的长度为n 的单链表L
void printList_L(LinkList L); //输出带头结点的单链表L
void printList_L_NoHead(LinkList L); //输出不带头结点的单链表L
Status GetElem_L(LinkList L, inti, ElemType&e);
Status ListInsert_L(LinkList&L, inti, ElemType e);
Status ListDelete_L(LinkList&L, inti, ElemType&e);
voidMergeList_L(LinkList&La, LinkList&Lb, LinkList&Lc);
voiddeleteallnodes(LinkList&L, ElemType min, ElemType max);
void ChangeLinkList01J(LinkList&L);
Status reorder5(LinkList&L);
//--------- p1list.cpp [例2-2-12] -----------------------------------
void deleteall_1(List *L, int x);
void deleteall_2(List *L, int x);
void deleteall_3(List *L, int x);
2. 这是线性表操作代码:
// 实验一:设计一个程序实现线性表上并操作。
// e1list.cpp : 定义控制台应用程序的入口点。
//
#include "p1list.h"
/* 此函数用于初始化一个保持增序的线性表L
* L的初值是通过键盘按照递增的次序一个自然数一个自然数输入的。
*/
void InitList(List &L) { //增序的;
inti=0,d;
L.elem[0]=GUARD; //-99
printf("\n输入某线性表各个元素的值(自然数) ,%d表示输入结束!\n", GUARD); do {
scanf("%d", &d);
if (d!=GUARD) {
if (i!=0 && d
printf("\n这里要初始化一个保持增序的线性表,请输入一个不小于的%d自然数",L.elem[i-1]);
elseL.elem[i++]=d;
}
}
if (i==MAXLEN) printf("\n该线性表长度达到最大值\n"); }while ((d!=GUARD)&&(i
/* 此函数用于初始化一个线性表L
* L的初值是通过键盘一个自然数一个自然数输入的。
*/
void InitList0(List &L) {
inti=0,d;
L.elem[0]=GUARD;
printf("输入某线性表各个元素的值(自然数) ,%d表示输入结束!\n", GUARD); do {
scanf("%d", &d);
if (d!=GUARD) L.elem[i++]=d;
if (i==MAXLEN) printf("\n该线性表长度达到最大值\n");
}while ((d!=GUARD)&&(i
L.length=i;
}
voidprintList(List L){
inti;
printf("线性表[%d]: \n", L.length);
for (i=0;i
printf("\n");
}
voidcreateTwoLists(List &La, List &Lb) {
}
printf("\n创建两个线性表--注意输入的两表的总长度不要超过%d\n",MAXLEN); InitList(La); //增序的 printf("\n初始化线性表Lb ,其长度不超过%d。超出部分被截断!\n", MAXLEN-La.length); InitList(Lb); if (La.length + Lb.length> MAXLEN) Lb.length=MAXLEN-La.length; //
/*TBD1* 将Lb 归并到La 表,形成新表Lc
*TBD1* 要求L0.c 保持有序,允许出现重复元素
*TB
D1*/
voidMergeList(List La, List Lb, List &Lc){
inti=0,j=0,m=0;
while(i
if(La.elem[i]>=Lb.elem[j])
Lc.elem[m++]=Lb.elem[j++];
elseLc.elem[m++]=La.elem[i++];
}
while(i
Lc.elem[m++]=La.elem[i++];
while(j
Lc.elem[m++]=Lb.elem[j++];
Lc.length=La.length+Lb.length;
}
/*TBD2* 线性La 和Lb 分别表示两个集合,求新集合La =La U Lb( U" 并" 操作) *TBD2* 注意集合里不允许出现重复元素
*TBD2*/
void Union(List &La, List Lb) {
inti=0,j=0,t,m=La.length; t=m;
while(i
if(La.elem[i]
i++;
}
else if(La.elem[i]==Lb.elem[j]){
i++;j++;
}
else {
}
}
} while(t>=i+1){ La.elem[t]=La.elem[t-1]; t--; } La.elem[i++]=Lb.elem[j++]; t=++La.length; while(j
/*TBD3* 将线性表L 逆转
*TBD3* 要求使用最少的附加空间,空间复杂度为O(1)。
*TBD3*/
voidReverseList(List &L) {
intj,i,n,c;
j=L.length-1;
n=L.length/2; //取半;
for(i=0;i
c=L.elem[i];
L.elem[i]=L.elem[j];
L.elem[j--]=c;
}
}
/*TBD4* 从一给定的顺序表L 中删除元素值在x 和y 之间的所有元素(x
*TBD4* 要求以较高的效率实现,空间复杂度为O(1)。
*TBD4*/
voiddeleteall(List &L, int x, int y) {
inti=0,n=0;
for(;i
if(L.elem[i]y) //机智啊把对的重新放一遍;
L.elem[n++]=L.elem[i];
}
L.length=n;
}
int main(intargc, char* argv[])
{
List La,Lb,Lc;
intx,y,n,h;
int j;
while(1){printf("\n1-创建数组La,Lb,2-合并数组La ,Lb 到Lc ,含重复元素3-归并Lb 到La ,不重复\n");
printf("4-逆转数组,5-删除数组中x-y 之间的值6-遍历La ,7-遍历Lb ,\n");
printf("输入大于7的数退出\n");
scanf("%d",&h);
// system("cls"); //盖住啦。。
switch(h){
case 1:{ createTwoLists(La,Lb);break;
}
case 2:{ MergeList(La,Lb,Lc);
printList(Lc);break;
}
case 3:{ Union(La,Lb);
printList(La);
break;}
case 4:{printf("逆转数组1-La 或2-Lb");
scanf("%d",&j);
if(j==1){
ReverseList(La);
printList(La);
}
else{
ReverseList(Lb);
printList(Lb);
}break;
}
case 5:{
printf("输入x,y, 顺序表L 中删除元素值在x 和y 之间的所有元素(x
scanf("%d",&x);
scanf("%d",&y);
printf("选择La 或Lb 表,1-La ,2-Lb");
scanf("%d",&n);
switch(n){
case 1: {deleteall(La,x,y);
printList(La);break;
}
case 2: {deleteall(Lb,x,y);
printList(Lb);break;
} }
break;
}
case 6:{ printList(La);break;
}
case 7:{ printList(Lb);break;
} } }//switch if(h>7) break; } //mainlottery(); printf("\n键入任意字符程序退出 ......"); getchar(); return 0;