数据结构之顺序表的操作

来源:互联网 发布:李连杰国际影响力 知乎 编辑:程序博客网 时间:2024/05/16 14:50
#include <iostream>
#include <cstdlib>
#include <stdio.h>
#include <windows.h>
#include <string>
using namespace std;
#define LIST_INIT_SIZE  100
#define LISTCEREMENT 10
#define OK 1
#define ERROR 0
typedef struct
{
int *date;
int length;
int listsize;
}Sqlist;
int InitList_Sq(Sqlist &L)     //初始化顺序表
{
L.date = (int*)malloc(LIST_INIT_SIZE*sizeof(int));
if (!L.date) return ERROR;
L.length = 0;
L.listsize = LIST_INIT_SIZE;
return OK;
}
int ListInsert_Sq(Sqlist &L, int i, int e) //顺序表插入
{
int *newbase;
if (i<1 || i>L.length + 1) return ERROR;
if (L.length >= L.listsize)
{
newbase = (int*)realloc(L.date, (L.listsize + LISTCEREMENT)*sizeof(int));
if (!newbase) return ERROR;
L.date = newbase;
L.listsize += LISTCEREMENT;
}
int *q, *p;
q = &(L.date[i - 1]);
for (p = &(L.date[L.length - 1]); p >= q; p--)
*(p + 1) = *p;
*q = e;
L.length++;
return OK;
}
int ListLength_Sq(Sqlist &L) //顺序表长度
{


return L.length;
}
int GetElem_Sq(Sqlist &L, int i, int& e)//顺序表中第i个元素,并用e返回
{
if (i<1 || i>ListLength_Sq(L) + 1) return ERROR;
e = L.date[i];
return OK;
}
void create_Sq(Sqlist &L) //顺序表创建
{
int i;
cout << "请输入要创建线性顺序表元素的个数:" << endl;
cin >> L.length;
for (i = 0; i < L.length; i++)
{
cin >> L.date[i];
}
}
void MargeList(Sqlist La, Sqlist Lb, Sqlist &Lc)//顺序表合并
{
//InitList_Sq(Lc);
int *pa_last;
int *pb_last;
int *pc,*pb,*pa;
//int ai;
//int bi;
pa = La.date;
pb = Lb.date;
Lc.listsize= Lc.length = La.length + Lb.length;
pc=Lc.date = (int*)malloc(Lc.listsize*sizeof(int));
pa_last = La.date + La.length - 1;
pb_last = Lb.date + Lb.length - 1;
while ((pa<= pa_last) && (pb<= pb_last))
{
//GetElem(La, i, ai);
//GetElem(Lb, j, bi);
if (*pa<= *pb)
{
//ListInsert_Sq(Lc, k++, ai);
//i++;
*pc++ = *pa++;
}
else
{
//ListInsert_Sq(Lc, k++, bi);
//j++;
*pc++ = *pb++;


}
}
while (pa<= pa_last)
{
//GetElem(Lc, i++, ai);
//ListInsert_Sq(Lc, k++, ai);
*pc++ = *pa++;


}
while (pb<= pb_last)
{
//GetElem(Lc, j++, bi);
//ListInsert_Sq(Lc, k++, bi);
*pc++ = *pb++;
}
}
void display(Sqlist &L) //顺序表显示
{
int i;
if (L.length == 0)
cout << "线性表中无元素可显示!!!" << endl;
else
{
for (i = 0; i < L.length; i++)
cout << L.date[i] << " ";
}
}
int ListDelete_Sq(Sqlist &L, int i, int e)//删除顺序表中第i个元素,并用e返回
{
if (i<1 || i>L.length) return ERROR;
int *p, *q;
p = &L.date[i - 1];
e = *p;
q = L.date + L.length - 1;
for (p++; p <= q; p++)
*(p-1) = *p;
L.length--;
return OK;
}
int LocateElem_Sq(Sqlist &L, int e,int(*Compare)(int,int))//返回第一个与e相等的位序
{
int i=1,*p=L.date;
while (i<=L.length&&!(*Compare)(*p++,e))
i++;
if (i <= L.length) return i;
else return 0;


}
int Compare_Sq(int a, int b)
{
if (a == b) return OK;
else
return ERROR;
}
int PriorElem_Sq(Sqlist &L, int cur_e, int &pre_e)//用pre_e返回顺序表的前驱
{
int i=1, *p = L.date;
while (i <= L.length&&!(*Compare_Sq)(*p++, cur_e));
i++;
if (i <= L.length)
{
pre_e = *(p - 2);
return OK;
}
else return ERROR;
}
int NextElem_Sq(Sqlist &L, int cur_e, int &next_e)//用next_e返回顺序表的后继
{
int i=1, *p = L.date;
while (i <L.length&&!(*Compare_Sq)(*p++, cur_e))
i++;
if (i < L.length)
{
next_e = *p;
return OK;
}
else
return ERROR;
}
int DestoryList_Sq(Sqlist &L)//顺序表销毁
{
free(L.date);
return OK;
}
int ClearList_Sq(Sqlist&L)//顺序表清空
{
L.length = 0;
return OK;
}
int ListEmpty_Sq(Sqlist &L)//判断顺序表是否为空
{
if (L.length == 0) return OK;
else
return ERROR;
}


int main_menu()
{
int n;
do
{
//system("cls");
cout << "********线性表的相关操作********" << endl;
cout << "********************************" << endl;
cout << "***(1)构造空表***(2)销毁该表****" << endl;
cout << "********************************" << endl;
cout << "***(3)置为空表***(4)元素个数****" << endl;
cout << "********************************" << endl;
cout << "***(5)元素的值***(6)元素位序****" << endl;
cout << "********************************" << endl;
cout << "***(7)输出前驱***(8)输出后继****" << endl;
cout << "********************************" << endl;
cout << "***(9)插入元素***(10)删除元素***" << endl;
cout << "********************************" << endl;
cout << "***(11)判断表空**(12)显示元素***" << endl;
cout << "********************************" << endl;
cout << "请选择菜单1—13" << endl;
cin >> n;
} while (n<1 || n>13);
return n;
}
int main()
{
Sqlist La, Lb, Lc;
InitList_Sq(La);
create_Sq(La);
InitList_Sq(Lb);
create_Sq(Lb);
system("cls");
MargeList(La, Lb, Lc);
Sleep(100);
int i, e, cur_e, next_e, pre_e, n;
for (;;)
{
switch (main_menu())
{
case 1:
InitList_Sq(Lc);
system("pause");
system("cls");
break; 
case 2: DestoryList_Sq(Lc);
system("pause");
system("cls");
break;
case 3:
system("cls");
ClearList_Sq(Lc);
cout << "线性表已重置为空\n";
system("pause"); 
system("cls");
break;
case 4: system("cls");
n = ListLength_Sq(Lc);
cout << "线性表L中的数据元素个数为:" << n << endl;
system("pause");
system("cls");
break;
case 5: system("cls");
cout << "请输入数据元素的位置i:"; cin >> i;
if (GetElem_Sq(Lc, i, e))
{
cout << "第" << i << "个元素的值为:" << e << endl;
system("pause");
system("cls");
break;
}
else
{
cout << "输入的i值不合法!\n";
system("pause");
system("cls");
break;
}
case 6: system("cls");
cout << "请输入要查找的数e:"; 
cin >> e;
i = LocateElem_Sq(Lc, e,Compare_Sq);
if (i)
{
cout << "数" << e << "在线性表L中的位置为:" << i << endl;
system("pause");
system("cls");
break;
}
else
{
cout << "线性表中不存在此数\n";
system("pause");
system("cls");
break;
}
case 7: system("cls");
cout << "请输入要查找前驱的数:"; cin >> cur_e;
if (PriorElem_Sq(Lc, cur_e, pre_e))
{
cout << "该数的前驱为:" << pre_e << endl;
system("pause");
system("cls");
break;
}
else
{
cout << "该数不在线性表中或者该数没有前驱\n";
system("pause");
system("cls");
break;
}
case 8: system("cls");
cout << "请输入要查找后继的数:"; cin >> cur_e;
if (NextElem_Sq(Lc, cur_e, next_e))
{
cout << "该数的后继为:" << next_e << endl;
system("pause");
system("cls");
break;
}
else
{
cout << "该数不在线性表中或者该数没有后继\n";
system("pause");
system("cls");
break;
}
case 9: system("cls");
cout << "请输入要插入数据元素的位置i:"; cin >> i;
cout << "请输入要插入数据元素的值e:"; cin >> e;
cout << "插入前线性表各元素为:\n\n";
display(Lc);
if (ListInsert_Sq(Lc, i, e))
{
cout << "插入后线性表各元素为:\n\n";
display(Lc);
system("pause");
system("cls");
break;
}
else
{
cout << "输入的i值不合法!无法插入\n";
system("pause");
system("cls");
break;
}
case 10:system("cls");
cout << "请输入要删除的位置i:"; 
cin >> i;
cout << "删除前线性表各元素为:\n\n";
display(Lc);
if (ListDelete_Sq(Lc, i, e))
{
cout << "删除后线性表各元素为:\n\n";
display(Lc);
cout << "删除的元素值为:" << i<< endl;
system("pause");
system("cls");
break;
}
else
{
cout << "输入的i值不合法!无法删除\n";
system("pause"); 
system("cls");
break;
}
case 11:system("cls");
if (ListEmpty_Sq(Lc))
{
cout << "线性表为空\n";
system("pause");
system("cls");
break;
}
else
{
cout << "线性表非空,其各元素值为:\n\n";
display(Lc);
system("pause");
system("cls");
break;
}
case 12:system("cls");
cout << "线性表各元素为:\n";
display(Lc);
system("pause");
system("cls");
break;
case 13:system("cls");
system("pause");
system("cls");
exit(0);
}
}
return 0;


system("pause");
system("cls");



}
0 0
原创粉丝点击