线性顺序表(动态数组实现)

来源:互联网 发布:vue.js v bind 编辑:程序博客网 时间:2024/05/21 04:25
//线性表的顺序表示指的是:用一组地址连续的存储单元依次存储线性表的数据元素.
//只要确定了存储线性表的起始位置,线性表中任一数据元素都可随机存取,
//所以线性表的顺序表存储结构是一种随机存取的存储结构.
#define OVERFLOW -1
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define NULL 0
#define LIST_INIT_SIZE 100   //线性表存储空间的初始分配量
#define LISTINCREMENT 10     //线性表存储空间的分配增量


#include<iostream>
#include<cstdio>
using namespace std;


typedef int Status;
typedef int ElemType; 
//-----线性表的动态分配顺序存储结构-----
typedef struct
{
ElemType *elem;  //存储空间基址
int length;      //当前长度
int listsize;    //当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;


//1.初始化空表
Status InitList_Sq(SqList &L)
{
//构造一个空的线性表L
L.elem = (ElemType *)malloc(LIST_INIT_SIZE *sizeof(ElemType));
if(! L.elem) 
exit(OVERFLOW);     //存储分配失败  
L.length = 0;                      //空表长度为0
L.listsize = LIST_INIT_SIZE;       //初始存储容量
return OK;
}//InitList_Sq


//2.建立顺序表L
Status CreatList_Sq(SqList &L,int n) 
{
int i;         
ElemType e;
cout << "输入顺序表的长度:";
cin >> n;
L.length = n;
if (L.length > LIST_INIT_SIZE) 
   L.elem = (ElemType *) realloc(L.elem,L.length*sizeof(ElemType));
cout<<"输入数据:";
for(i = 0;i <= L.length-1;i++) 
{
scanf("%d",&e);   
L.elem[i] = e; 
}
return OK;
}
//3.销毁线性表
Status DestoryList_Sq(SqList &L)
{
//销毁线性表L
if (L.elem) 
{
free(L.elem); 
L.elem = NULL; 
        L.length = L.listsize = 0;
return OK;
}
return ERROR;
}
//4.重置空表
Status ClearList_Sq(SqList &L)
{//将L重置为空表
L.length = 0;
cout << "Success!" <<endl;
return OK;
}
//5.判定是否空表
Status ListEmpty_Sq(SqList L) 
{//判定是否空表,若L为空表,则返回TRUE,否则返回FALSE
if (L.length) 
return ERROR;
return OK;
}
//6.求表长
int ListLength_Sq(SqList L)
{ //求L中数据元素的个数
return L.length;
}
//7.取表第i个元素
Status GetElem_Sq(SqList L, int i, ElemType &e)
{ //用e返回顺序表L中第i个数据元素的值
//i的合法值为1 <= i <= ListLength_Sq(L)
if ((i < 1)||(i > L.length)) 
return ERROR;  //i值不合法
else
e = L.elem[i-1];
return OK;
}
//8.顺序表查找
int LocateElem_Sq(SqList L,ElemType e)
{ //在顺序线性表L中查找第1个值与e相等的元素的位序
//若找到,则返回其在L中的位序,否则返回0
int i = 1;
ElemType *p;        //i的初值位第1个元素的位序
p = L.elem;    //p的初值位第1个元素的存储位置  
while (i <= L.length && L.elem[i] != e) 
i++;
if (i <= L.length) 
return (i);
else 
return 0;
}//LocateElem_Sq


//9.求表L中元素的前驱
Status PriorElem_Sq(SqList L, ElemType cur_e, ElemType &pre_e)
{ //求表L中cur_e元素的前驱,用pre_e返回
int i;
cout << "输入特定元素值:";
cin >> cur_e;
i = LocateElem_Sq(L,cur_e);
if (i <= 1) 
return ERROR;  //i值不合法
pre_e = L.elem[i-1];
cout << pre_e << endl;
return OK;
}
//10.求表L中元素的后继
Status NextElem_Sq(SqList L, ElemType cur_e, ElemType &next_e)
{ //求表L中cur_e元素的后继,用next_e返回
int i;
cout<<"输入特定元素值:";
cin>>cur_e;
i=LocateElem_Sq(L,cur_e);
if (i>=L.length) 
return ERROR;  //i值不合法
next_e=L.elem[i + 1];
cout<<next_e << endl;
return OK;
}
//11.插入结点
Status ListInsert_Sq(SqList &L, int i, ElemType e)
{ //在顺序线性表L中第i个位置之前插入新的元素e
ElemType *q,*p,*newbase;   //i的合法值为1<=i<=ListLength_Sq(L)+1
if(i < 1 || i > L.length+1) 
return ERROR;  //i值不合法
if (L.length >= L.listsize)
{
//当前存储空间已满,增加分配
newbase = (ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if (!newbase) exit(OVERFLOW);  //存储分配失败
L.elem = newbase;                //新基址
L.listsize += LISTINCREMENT;     //增加存储容量
}
q = &(L.elem[i-1]);               //q为插入位置
for (p = &(L.elem[L.length - 1]);p >= q;--p) 
*(p+1) = *p;  //插入位置及之后的元素后移
*q = e;           //插入e
++L.length;     //表长增1
return OK;
}//ListInsert_Sq


//12.删除结点
Status ListDelete_Sq(SqList &L, int i, ElemType &e)
{ //在顺序线性表L中删除第i个元素,并用e返回其值
ElemType *p,*q;
//i的合法值为1 <= i <= ListLength_Sq(L)
if((i < 1) || (i > L.length)) 
return ERROR;  //i值不合法
p = &(L.elem[i - 1]);                      //p为被删除元素的位置
e = *p;                                  //被删除元素的值赋给e
q = L.elem + L.length - 1;                   //表尾元素的位置
for (++p;p <= q;++p) 
*(p-1) = *p;          //被删除元素之后的元素左移
--L.length;                            //表长减1
return OK;
}//ListDelete_Sq


//13.表遍历
Status ListTraverse(SqList L,Status(* visit)(ElemType e))
{ //遍历表. 依次对L的每个数据元素调用函数visit().一旦visit()失败,则操作失败.
int i;
for (i = 0;i <= L.length - 1;i++) 
{
(* visit)(L.elem[i]); 
cout<<"  ";
}
cout<<endl;  
return OK;
}


//14.归并顺序表
void MergeList_Sq(SqList La,SqList Lb,SqList &Lc)
{ //已知顺序线性表La和Lb的元素按值非递减排列
//归并La和Lb得到新的顺序线性表Lc,Lc的元素也按值非递减排列
ElemType *pa,*pb,*pc,*pa_last,*pb_last; 
pa = La.elem;           
pb = Lb.elem; 
Lc.listsize = Lc.length = La.length + Lb.length;
pc = Lc.elem = (ElemType *)malloc(Lc.listsize*sizeof(ElemType));
if (!Lc.elem) 
exit(OVERFLOW);  //存储分配失败
pa_last = La.elem + La.length - 1;
pb_last = Lb.elem + Lb.length - 1;
while (pa <= pa_last && pb <= pb_last)
{//归并
if (pa <= pb) 
*pc++ = *pa++;  
else 
*pc++ = *pb++;
}
while (pa <= pa_last) 
*pc++ = *pa++;  //插入La的剩余元素
while (pb <= pb_last) 
*pc++ = *pb++;  //插入Lb的剩余元素
}//MergeList_Sq


//15.输出顺序表
void Output(SqList L)//输出线性表L 
{
     int i;
     for(i = 0;i < L.length;i++)
           printf("%d ",L.elem[i]);
     printf("\n");



//16.对顺序表数据元素按升序排列
int SortInc(SqList &L)
{
//用冒泡法排序
int temp;
for(int i = 0;i < L.length - 1;i++)
for(int j = i;j < L.length;j++)
{
if(L.elem[i] > L.elem[j])
{
temp = L.elem[i];
L.elem[i] = L.elem[j];
L.elem[j] = temp;
}
}
return 0;
}


//17.对顺序表数据元素按降序排列
int SortDec(SqList &L)
{
//用冒泡法排序
int temp;
for(int i = L.length - 1;i > 0;i--)
for(int j = i;j >= 0 ;j--)
{
if(L.elem[i] > L.elem[j])
{
temp = L.elem[i];
L.elem[i] = L.elem[j];
L.elem[j] = temp;
}
}
return 0;
}


//18.将一个顺序表逆置
int Inversion_Sq(SqList &L)
{
int i,temp;
for(i = 0;i < L.length/2;i++)
{
temp = L.elem[i];
L.elem[i] = L.elem[L.length - i - 1];
L.elem[L.length-i-1] = temp;
}
return 1;
}


void output()//窗口边框
{
     int i;
     for(i = 0;i < 10;i ++)
        printf(" ");
     for(i = 0;i < 31;i ++)
        printf("*");
     printf("\n");
}


void mainpp()//显示窗口
{
     int i;
     output();
     for(i = 0;i < 10;i ++)
        printf(" ");
        printf("*   ");
     printf("1.建立一个顺序表");
     for(i = 0;i < 10;i++)
        printf(" ");
        printf("*");
        printf("\n"); 
     for(i = 0;i < 10;i ++)
        printf(" ");
        printf("*   ");
     printf("2.输出一个顺序表");
     for(i = 0;i < 10;i++)
        printf(" ");
        printf("*");
        printf("\n"); 
     for(i = 0;i < 10;i ++)
        printf(" ");
        printf("*   ");
     printf("3.在顺序表中查找");
     for(i = 0;i < 10;i ++)
        printf(" ");
        printf("*");
        printf("\n");
     for(i = 0;i < 10;i ++)
        printf(" ");
        printf("*   ");
     printf("4.向顺序表中插入一个元素");
     for(i = 0;i < 2;i++)
        printf(" ");
        printf("*");
        printf("\n"); 
     for(i = 0;i < 10;i ++)
        printf(" ");
        printf("*   ");
     printf("5.删除顺序表中的一个元素");
     for(i = 0;i < 2;i++)
        printf(" ");
        printf("*");
        printf("\n"); 
     for(i = 0;i < 10;i++)
        printf(" ");
        printf("*   ");
     printf("6.从顺序表中取出一个元素");
     for(i = 0;i < 2;i++)
        printf(" ");
        printf("*");
        printf("\n"); 
     for(i = 0;i < 10;i++)
        printf(" ");
        printf("*   ");
     printf("7.将两个顺序表合并");
     for(i = 0;i < 8;i++)
        printf(" ");
        printf("*");
        printf("\n"); 
     for(i = 0;i < 10;i++)
        printf(" ");
        printf("*   ");
printf("8.比较两个顺序表的大小");
     for(i = 0;i < 4;i++)
        printf(" ");
        printf("*");
        printf("\n"); 
     for(i = 0;i < 10;i++)
        printf(" ");
        printf("*   ");
printf("9.将顺序表逆置");
     for(i = 0;i < 12;i++)
        printf(" ");
        printf("*");
        printf("\n"); 
     for(i = 0;i < 10;i++)
        printf(" ");
        printf("*   ");
printf("10.将顺序表中升序排序");
     for(i = 0;i < 5;i++)
        printf(" ");
        printf("*");
        printf("\n"); 
     for(i = 0;i < 10;i++)
        printf(" ");
        printf("*   ");
printf("11.将顺序表中降序排序");
     for(i = 0;i < 5;i++)
        printf(" ");
        printf("*");
        printf("\n"); 
     for(i = 0;i < 10;i++)
        printf(" ");
        printf("*   ");
printf("12.判断顺序表中是否为空");
     for(i = 0;i < 3;i++)
        printf(" ");
        printf("*");
        printf("\n"); 
     for(i = 0;i < 10;i++)
        printf(" ");
        printf("*   ");
printf("13.求表L中元素的前驱");
     for(i = 0;i < 6;i++)
        printf(" ");
        printf("*");
        printf("\n"); 
     for(i = 0;i < 10;i++)
        printf(" ");
        printf("*   ");
printf("14.求表L中元素的后驱");
     for(i = 0;i < 6;i++)
        printf(" ");
        printf("*");
        printf("\n"); 
     for(i = 0;i < 10;i++)
        printf(" ");
        printf("*   ");
printf("15.销毁线性表");
     for(i = 0;i < 13;i++)
        printf(" ");
        printf("*");
        printf("\n"); 
     for(i = 0;i < 10;i++)
        printf(" ");
        printf("*   ");
printf("16.重置顺序表");
     for(i = 0;i < 13;i++)
        printf(" ");
        printf("*");
        printf("\n"); 
     for(i = 0;i < 10;i++)
        printf(" ");
        printf("*   ");
     printf("0.退           出 "); 
     for(i = 0;i < 8;i++)
        printf(" ");
        printf("*");
        printf("\n"); 
     output(); 
}


int main()//主函数
{
     int n = 0,i,j = 0,k = 1,m,p,q,x,y,e,cur_e = 0,pre_e = 0,next_e;
     SqList l,la,lc;
     InitList_Sq(l);
     mainpp();
     while(k) 
     {
           printf("请选择0--16:");
           scanf("%d",&m);
           getchar();
           switch(m)
           {
                  case 0:exit(0);
                  case 1:{
                       CreatList_Sq(l,n);
                       Output(l);
                       break;
                       }  
                  case 2:Output(l);printf("\n");break;
                  case 3:{
                       printf("请输入要查找的元素值:");
                       scanf("%d",&x);
                       j = LocateElem_Sq(l,x) + 1;
                       printf("要查找的元素的位序:%d\n",j);
                       printf("\n");
                       break;
                       }
                  case 4:{
                       printf("请输入要插入的元素的位置及其值:");
                       fflush(stdin);
                       scanf("%d",&i);
                       scanf("%d",&x);
                       ListInsert_Sq(l,i,x);
                       Output(l);
                       printf("\n");
                       break;
                       }
                  case 5:{
                       printf("请输入要删除元素的位置:");
                       fflush(stdin);
                       scanf("%d",&i);
                       ListDelete_Sq(l,i,y); 
                       Output(l);
                       printf("\n");
                       break;
                       }
                  case 6:{
                       printf("请输入要取出的元素的序号:");
                       fflush(stdin);
                       scanf("%d",&i);
                       GetElem_Sq(l,i,e);
                       printf("取出的第%d个元素为:%d\n",i,e);
                       break;
                       }
                  case 7:{
                       InitList_Sq(la);
  InitList_Sq(lc);
                       printf("请输入第2个顺序表元素的个数: \n");
  printf("输入元素值,构建顺序表:\n");
                       scanf("%d",&m);
                       CreatList_Sq(la,m);
  printf("\n新建的顺序表为:\n");
                       Output(la);
                       MergeList_Sq(l,la,lc); 
                       printf("输出合并后的顺序表中的元素:\n");
                       Output(lc);
                       break;
                       }
 case 8:{
                       InitList_Sq(la);
                       printf("请输入第2个顺序表元素的个数: \n");
  printf("输入元素值,构建顺序表:\n");
                       scanf("%d",&m);
                       CreatList_Sq(la,m);
  printf("\n新建的顺序表为:\n");
                       Output(la);
  if(p == 1)
  printf("l > la");
  else if(p == -1)
  printf("l < la");
  else 
  printf("l == la");
                       break;
                       }
 case 9:{
 Inversion_Sq(l);
                      Output(l);
                      printf("\n");
                      break;
                      }
 case 10:{
 SortInc(l);
                      Output(l);
                      printf("\n");
                      break;
                      }
 case 11:{
 SortDec(l);
                      Output(l);
                      printf("\n");
                      break;
                      }
 case 12:{
 q = ListEmpty_Sq(l);
 if(q == 1)
 printf("此表为空");
 else
     printf("此表不空");
                      printf("\n");
                      break;
                      }
 case 13:
 {
 PriorElem_Sq(l,cur_e,pre_e);
 break;
 }
 case 14:
 {
 NextElem_Sq(l,cur_e,next_e);
 break;
 }
 case 15:
 {
 DestoryList_Sq(l);
 break;
 }
 case 16:
 {
 ClearList_Sq(l);
 break;
 }
                  default :exit(0);
           }  
           printf("继续运行吗?Y(1)/N(0):");
           scanf("%d",&k);
           if(!k)
           exit(0); 
     } 
return 0;
原创粉丝点击