顺序表

来源:互联网 发布:注册给排水知乎 编辑:程序博客网 时间:2024/04/30 08:13

#include<stdio.h>

#include<stdlib.h>

#include<conio.h>

#include<iostream>

using namespace std;

#define ListSize 100//最大允许长度

typedef int ListData;

typedef struct{

ListData *data;//存储数组

int length;//当前元素个数(长度)

}SeqList;

 ListData InitList(SeqList &L)//建立空的顺序表

{

L.data=(ListData*)malloc

      (ListSize*sizeof(ListData));

  if(L.data==NULL){

  printf("存储分配失败!/n");

  exit(1);

  }

  L.length=0;

  return 1;

}

 ListData Creat_SeqList(SeqList &L)//自定义创建顺序表数据

{

int c,i=0;

cout<<"请输入自定义数据,按Ctrl+Z结束"<<"/n"<<endl;

while(scanf("%d",&c)!=EOF)//按Ctrl+Z组合键结束输入

{

if(i>=ListSize)//自定义数据表超过初始化大小 

{

cout<<"自定义数据表超过初始化大小"<<endl;

}

L.data[i++]=c;

}

L.length=i;

cout<<"/n"<<endl;

return 0;

    }

 ListData Print(SeqList &L,int length)

{

    int i;

    printf("表中元素是:"); 

    for(i=0;i<L.length;i++)

    printf(" %d ",L.data[i]);

    printf("/n共有元素 %d 个/n",L.length);

return 0;

}

 

 ListData Length(SeqList &L){

return L.length;

}

ListData GetData(SeqList &L,int i)//查找元素按位置查找

{

if(i>=0&&i<L.length)

return L.data[i];

else printf("参数i不合理!/n");

}//在出错情况,函数不能用

 

ListData  Find ( SeqList &L, ListData x ) {//按值查找

        int i = 0;

        while ( i < L.length && L.data[i] != x )

                  i++;

        if ( i < L.length )

return i;

        else

return -1;

}

 

ListData Insert(SeqList &L,int i,ListData x){//在表中第i个位置插入新元素x

if(i<0||i>L.length||L.length==ListSize)

{printf("输入不合法,插入不成功/n");

return 0;//插入不成功

   }

else{

for(int j=L.length;j>i;j--)

L.data[j]=L.data[j-1];

L.data[i]=x;L.length++;

   printf("插入成功/n");

return 1;//插入成功

}

}

int Delete(SeqList &L,ListData x)//在表中删除已有元素x

{int i=Find(L,x);//在表中查找x

if(i>=0){

L.length--;

for(int j=i; j<L.length;j++)

L.data[j]=L.data[j+1];

   cout<<"成功删除"<<endl;

   return 1;//成功删除

         }

        cout<<"表中没有x"<<endl;

return 0;//表中没有x

}

 

int main()

{    cout<<"                 *------------------------------------------*"<<endl;

     cout<<"                 *                                          *"<<endl;

     cout<<"                 *            1.......建立顺序表            *"<<endl;

     cout<<"                 *                                          *"<<endl;

     cout<<"                 *            2.......输入数据              *"<<endl;

     cout<<"                 *                                          *"<<endl;

     cout<<"                 *            3.......显示数据              *"<<endl;

     cout<<"                 *                                          *"<<endl;

     cout<<"                 *            4.......按位置插入数据        *"<<endl;

     cout<<"                 *                                          *"<<endl;

     cout<<"                 *            5.......按位置查找数据        *"<<endl;

     cout<<"                 *                                          *"<<endl;

     cout<<"                 *            6.......按值查找数据          *"<<endl;

     cout<<"                 *                                          *"<<endl;

     cout<<"                 *            7.......删除数据              *"<<endl;

     cout<<"                 *                                          *"<<endl;

     cout<<"                 *            0...........退出              *"<<endl;

     cout<<"                 *                                          *"<<endl;

     cout<<"                 *------------------------------------------*"<<endl;

SeqList L;

int length;

int i,x;

      while(1)

    {

            switch(getch())                 

             {

                            case '1':  InitList(L);

                                      if(!L.length)

                                     printf("建立空表成功,请按2输入数据/n"); 

                                      else printf("建立失败/n"); 

                                      break;

case '2': Creat_SeqList(L);

     if(L.length)

                                      printf("顺序表建立成功,按3显示数据/n"); 

                                      else printf("建立失败/n"); 

                                      break;

                            case '3': if(L.length)

                                      Print(L,L.length);

                                      else printf("空表/n");

                                      break;

                            case '4': if(L.length)

                                      {

                                              printf("输入插入的位置i:");

                                              scanf("%d",&i);

                                              printf("输入插入的元素:");

                                              scanf("%d",&x); 

                                              if(Insert(L,i,x)) 

                                              printf("插入成功,按3显示/n");

                                      }

                                      else printf("未建立顺序表/n");

                                      break; 

                             case '5': if(L.length)

                                      {

                                               printf("输入查找位置:/n");

                                               scanf("%d",&i);

                                               while(i>L.length|| i<1)

                                               {

                                                       printf("输入位置错误,请重新输入:/n");

                                                       scanf("%d",&i);

                                               }

                                               printf("第%d个元素是:%d/n",i,GetData(L,i));

                                      }

                                      else printf("未建立顺序表/n");

                                      break;

                           case '6': if(L.length)

                                      {

                                               printf("输入查找数据:/n");

                                               scanf("%d",&x);

                                               if(Find(L,x))

                                               printf("%d在表中是第%d个元素/n",x,Find(L,x));

                                               else printf("该表中没有%d这个元素./n",x); 

                                      }

                                      else printf("未建立顺序表/n");

                                      break;                               

                            case '7':if(L.length)

                                      {

                                              printf("输入删除元素的位置:");

                                              scanf("%d",&x);

                                              if(Delete(L,x))

                                              printf("删除成功,按3显示/n");

                                      }

                                      else printf("未建立顺序表/n");

                                      break;  

case '0':exit(0);break;

                            default : printf("操作错误/n");break; 

             }

    }

getch();

}