离期末考试还有一个多月,打算系统复习一下数据结构。因为这段时间投入在数据结构上的时间基本没有。
所以掌握十分不牢固。现在贴段程序。希望园子里的朋友可以帮我解决一下指针的使用出的读写错误。
这是源码:
#include
<
iostream
>
#define Max 100
using namespace std;
typedef int datatype;
/* 线性表结构 */
typedef struct SeqList{
datatype data[Max];
int last;
} SeqList;
/* 初始化 */
SeqList * init_SeqList()
{
SeqList * L; int i;
L = new SeqList;
cout << " 请输入顺序表的长度 " << endl;
cin >> L -> last;
L -> last -- ;
cout << " 请输入顺序表的内容 " << endl;
for (i = 0 ;i <= L -> last;i ++ )
cin >> L -> data[i];
return L;
}
/* 读取 */
void Print(SeqList * L)
{
int i;
cout << " 顺序表内容为: " << endl;
for (i = 0 ;i <= L -> last;i ++ )
cout << L -> data[i] << endl;
}
/* 从小到大排序 */
void Part(SeqList * L)
{
int i,j;
datatype t;
for (j = 0 ;j <= L -> last;j ++ )
{ for (i = 0 ;i < L -> last - j;i ++ )
if (L -> data[i] > L -> data[i + 1 ])
{ t = L -> data[i];
L -> data[i] = L -> data[i + 1 ];
L -> data[i + 1 ] = t;}
}
}
/* 插入 */
int Insert(SeqList * L, int i,datatype x){
int j;
if (L -> last > Max - 1 ){
cout << " 表满 " << endl;
return - 1 ;
}
if (i < 1 || i > L -> last + 2 ){
cout << " 插入位置错误!插入失败 " << endl;
return 0 ;
}
for (j = L -> last;j >= i - 1 ;j -- )
L -> data[j + 1 ] = L -> data[j];
L -> data[i - 1 ] = x;
L -> last ++ ;
return 1 ;
}
/* 删除 */
int Delete(SeqList * L, int i){
int j;
if (i < 1 || i > L -> last + 1 ){
cout << " 不存在第i个元素 " << endl;
return 0 ;
}
for (j = i;j <= L -> last;j ++ )
L -> data[j - 1 ] = L -> data[j];
L -> last -- ;
return 0 ;
}
/* 按值查找 */
int Location(SeqList * L,datatype x){
int i;
i = 0 ;
while (i <= L -> last && L -> data[i] != x){
i ++ ;
if (i > L -> last){
return - 1 ;
}
}
return i + 1 ;
}
/* 线性表合并 */
void Merge(SeqList * A,SeqList * B,SeqList * C){
int i,j,k;
i = 0 ;
j = 0 ;
k = 0 ;
while (i <= A -> last && j <= B -> last)
if (A -> data[i] < B -> data[j])
C -> data[k ++ ] = A -> data[i ++ ];
else
C -> data[k ++ ] = B -> data[j ++ ];
while (i <= A -> last)
C -> data[k ++ ] = A -> data[i ++ ];
while (j <= B -> last)
C -> data[k ++ ] = B -> data[j ++ ];
C -> last = k;
}
/* 两个线性表的比较 */
int Compare( int A[], int B[], int m, int n){
int i,j,AS[ 100 ],BS[ 100 ],ms,ns;
i = 0 ;
ms = ns = 0 ;
while (i <= m && i <= n && A[i] == B[i])
i ++ ;
for (j = i;j < m;j ++ ){
AS[j = i] = A[j];
ms ++ ;
}
for (j = i;j < n;j ++ ){
BS[j - i] = B[j];
ns ++ ;
}
if (ms == ns && ms == 0 )
return 0 ;
else
if (ms == 0 && ns > 0 || ms > 0 && ns > 0 && AS[ 0 ] < BS[ 0 ])
return - 1 ;
else
return 1 ;
}
/* 线性表转化成数组 */
int Change(SeqList * L){
int i;
int a[L -> last];
for (i = 0 ;i < L -> last;i ++ )
a[i] = L -> data[i];
return a[L -> last];
}
/* 主函数 */
int main()
{
int into;
int del;
int result;
int a[ 100 ];
int b[ 100 ];
datatype find;
datatype num;
SeqList * L;
SeqList * L2;
SeqList * L3;
L = init_SeqList();
cout << " 您输入的 " ;
Print(L);
Part(L);
cout << " 从小到大排序后的 " ;
Print(L);
cout << " 请输入您要插入的数: " << endl;
cin >> num;
cout << " 请输入您要插入的位置: " << endl;
cin >> into;
Insert(L,into,num);
cout << " 插入后的 " ;
Print(L);
cout << " 请输入您要删除的元素位置: " << endl;
cin >> del;
Delete(L,del);
Print(L);
cout << " 请输入您要查找的数 " << endl;
cin >> find;
cout << " 您查找的数在第 " << Location(L,find) << " 位 " << endl;
cout << " 输入第二个线性表: " << endl;
L2 = init_SeqList();
cout << " 您输入的 " ;
Print(L2);
Part(L);
Part(L2);
Merge(L,L2,L3);
cout << " 两个从小到大线性表合并后的 " ;
Print(L3);
cout << " 线性表转化成数组 " << endl;
a[ 100 ] = Change(L);
b[ 100 ] = Change(L2);
int * x;
int * y;
x =& a[ 100 ];
y =& b[ 100 ];
cout << " 两个线性表的比较 " << endl;
result = Compare(x,y,L -> last,L2 -> last);
if (result = 1 ){
cout << " A线性表大于B线性表 " << endl;
} else if (result = 0 ){
cout << " A线性表等于B线性表 " << endl;
} else if (result =- 1 ){
cout << " A线性表小于B线性表 " << endl;
}
return 0 ;
}
#define Max 100
using namespace std;
typedef int datatype;
/* 线性表结构 */
typedef struct SeqList{
datatype data[Max];
int last;
} SeqList;
/* 初始化 */
SeqList * init_SeqList()
{
SeqList * L; int i;
L = new SeqList;
cout << " 请输入顺序表的长度 " << endl;
cin >> L -> last;
L -> last -- ;
cout << " 请输入顺序表的内容 " << endl;
for (i = 0 ;i <= L -> last;i ++ )
cin >> L -> data[i];
return L;
}
/* 读取 */
void Print(SeqList * L)
{
int i;
cout << " 顺序表内容为: " << endl;
for (i = 0 ;i <= L -> last;i ++ )
cout << L -> data[i] << endl;
}
/* 从小到大排序 */
void Part(SeqList * L)
{
int i,j;
datatype t;
for (j = 0 ;j <= L -> last;j ++ )
{ for (i = 0 ;i < L -> last - j;i ++ )
if (L -> data[i] > L -> data[i + 1 ])
{ t = L -> data[i];
L -> data[i] = L -> data[i + 1 ];
L -> data[i + 1 ] = t;}
}
}
/* 插入 */
int Insert(SeqList * L, int i,datatype x){
int j;
if (L -> last > Max - 1 ){
cout << " 表满 " << endl;
return - 1 ;
}
if (i < 1 || i > L -> last + 2 ){
cout << " 插入位置错误!插入失败 " << endl;
return 0 ;
}
for (j = L -> last;j >= i - 1 ;j -- )
L -> data[j + 1 ] = L -> data[j];
L -> data[i - 1 ] = x;
L -> last ++ ;
return 1 ;
}
/* 删除 */
int Delete(SeqList * L, int i){
int j;
if (i < 1 || i > L -> last + 1 ){
cout << " 不存在第i个元素 " << endl;
return 0 ;
}
for (j = i;j <= L -> last;j ++ )
L -> data[j - 1 ] = L -> data[j];
L -> last -- ;
return 0 ;
}
/* 按值查找 */
int Location(SeqList * L,datatype x){
int i;
i = 0 ;
while (i <= L -> last && L -> data[i] != x){
i ++ ;
if (i > L -> last){
return - 1 ;
}
}
return i + 1 ;
}
/* 线性表合并 */
void Merge(SeqList * A,SeqList * B,SeqList * C){
int i,j,k;
i = 0 ;
j = 0 ;
k = 0 ;
while (i <= A -> last && j <= B -> last)
if (A -> data[i] < B -> data[j])
C -> data[k ++ ] = A -> data[i ++ ];
else
C -> data[k ++ ] = B -> data[j ++ ];
while (i <= A -> last)
C -> data[k ++ ] = A -> data[i ++ ];
while (j <= B -> last)
C -> data[k ++ ] = B -> data[j ++ ];
C -> last = k;
}
/* 两个线性表的比较 */
int Compare( int A[], int B[], int m, int n){
int i,j,AS[ 100 ],BS[ 100 ],ms,ns;
i = 0 ;
ms = ns = 0 ;
while (i <= m && i <= n && A[i] == B[i])
i ++ ;
for (j = i;j < m;j ++ ){
AS[j = i] = A[j];
ms ++ ;
}
for (j = i;j < n;j ++ ){
BS[j - i] = B[j];
ns ++ ;
}
if (ms == ns && ms == 0 )
return 0 ;
else
if (ms == 0 && ns > 0 || ms > 0 && ns > 0 && AS[ 0 ] < BS[ 0 ])
return - 1 ;
else
return 1 ;
}
/* 线性表转化成数组 */
int Change(SeqList * L){
int i;
int a[L -> last];
for (i = 0 ;i < L -> last;i ++ )
a[i] = L -> data[i];
return a[L -> last];
}
/* 主函数 */
int main()
{
int into;
int del;
int result;
int a[ 100 ];
int b[ 100 ];
datatype find;
datatype num;
SeqList * L;
SeqList * L2;
SeqList * L3;
L = init_SeqList();
cout << " 您输入的 " ;
Print(L);
Part(L);
cout << " 从小到大排序后的 " ;
Print(L);
cout << " 请输入您要插入的数: " << endl;
cin >> num;
cout << " 请输入您要插入的位置: " << endl;
cin >> into;
Insert(L,into,num);
cout << " 插入后的 " ;
Print(L);
cout << " 请输入您要删除的元素位置: " << endl;
cin >> del;
Delete(L,del);
Print(L);
cout << " 请输入您要查找的数 " << endl;
cin >> find;
cout << " 您查找的数在第 " << Location(L,find) << " 位 " << endl;
cout << " 输入第二个线性表: " << endl;
L2 = init_SeqList();
cout << " 您输入的 " ;
Print(L2);
Part(L);
Part(L2);
Merge(L,L2,L3);
cout << " 两个从小到大线性表合并后的 " ;
Print(L3);
cout << " 线性表转化成数组 " << endl;
a[ 100 ] = Change(L);
b[ 100 ] = Change(L2);
int * x;
int * y;
x =& a[ 100 ];
y =& b[ 100 ];
cout << " 两个线性表的比较 " << endl;
result = Compare(x,y,L -> last,L2 -> last);
if (result = 1 ){
cout << " A线性表大于B线性表 " << endl;
} else if (result = 0 ){
cout << " A线性表等于B线性表 " << endl;
} else if (result =- 1 ){
cout << " A线性表小于B线性表 " << endl;
}
return 0 ;
}
编译可以通过,但是合并线性表这里有问题,而且两个线性表的比较也不成功,希望朋友可以帮忙看看。谢谢!
基础不牢,见笑了。