数据结构——顺序表

来源:互联网 发布:施工组织设计软件 编辑:程序博客网 时间:2024/05/21 01:53
顺序表静态存储数组空间由编译器固定分配,程序执行结后此空间自动释放,可按照数组元素的下标(位置)存取任一元素的值,所化费时间相同。一旦数据空间占满,再加入新的数据就将产生溢出,此时存储空间不能扩充,就会导致程序停止工作1 //顺序表静态存储  2 #define maxSize 100  3 typedef int DataType;  4 typedef struct  5 {  6     DataType data[maxSize];  7     int n;  8 }SeqList;  9  10 顺序表动态存储通过动态存储分配的语句malloc或new动态分配的,一旦数据空间占满,可以另外再分配一块更大的空间,用以代换原来的存储空间,而达到扩充存储数组空间的目的 11 //顺序表动态存储 12 #define initSize 100 13 typedef int DataType; 14 typedef struct 15 { 16     DataType *data; 17     int maxSize, n; 18 }SeqList; 19 //顺序表主要操作实现 20 //顺序表的动态存储表示的初始化处理 21 void initList(SeqList &L) 22 { 23     L.data = new DataType[initList]; 24     if(!L.data) 25     { 26         cerr<<"存储分配错误!\n"; 27         exit(1); 28     } 29     L.maxSize = initSize; 30     L.n = 0; 31 } 32 //清空顺序表 33 void clearList(SeqList& L) 34 { 35     L.n = 0;//顺序表当前长度置为0 36 }
37 //计算顺序表长度 38 void Length(SeqList) 39 { 40     return L.n;//返回顺序表的当前长度 41 } 42 //判表空否 43 int ieEmpty(SeqList& L) 44 { 45     return (L.n == 0)?1:0; 46 } 47 //判表满否 48 int is Full(SeqList) 49 { 50     return (L.n == L.maxSize)?1:0; 51 } 52 //顺序表查找算法 53 int Search(SeqList& L, int i)//   在顺序表查找与值x匹配的位置,查找成功则函数返回该元素的位置,否则函数返回0 54 { 55     for(i = 1; i<=L.n; i++) 56     { 57         if(L.data[i-1] == x)//顺序查找 58             return i; 59     } 60     return 0;//查找失败 61 } 62 //顺序表定位算法 63 int Locate(SeqList& L, int i)//函数返回第i个元素的位置 64 { 65     if(i>1 && i<L.n) 66         return i; 67     else 68         return 0; 69 }
70 //顺序表复制算法 71 int Copy(SeqList& L1, SeqList& L2)//L1,L2存在且L1为空,将L2复制到L1中 72 { 73     L1.maxSize = L2.maxSize; 74     L1.n = L2.n; 75     if(!L1.data) 76     { 77         L1.data = new DataType[L1.maxSize];//创建顺序表存储数组 78         if(!L1.data)//链接stdlib.h和iostream.h 79         { 80             cout<<"内存分配错误!"<<endl; 81             exit(1); 82         } 83     } 84     for(int i=1; i<=L; i++) 85     { 86         L1.data[i-1] = L2.data[i-1]; 87     } 88 } 89 //顺序表插入算法 90 int Insert(SeqList& L, int i;, DataType& x) 91 { 92     //将新元素插入到表中第i个位置,若插入成功函数返回1,否则返回0 93     if(L.n == L.maxSize)//表满,不能插 94         return 0; 95     if(i<0 || i>L.n+1)//参数i不合理,不能插入 96         return 0; 97     for(int j=L.n; j>=i; j--)//依次后移,空出第i号位置 98     { 99         L.data[j] = L.data[j-1];100     }101     L.data[i-1] = x;//插入102     L.n++;       //表长度加1103     return 1;    //插入成功104 }
105 //顺序表删除算法106 int Remove(SeqList& L, int i, DataType& x)107 {108     //删除顺序表第i个元素,通过引用型参数x返回删除元素的值109     //若删除成功则函数返回1,否则返回0110     if(!L.n)//表空,不能删除111         return 0;112     if(i<0 || i>L.n)//参数i不合理,不能删除113         return 0;114     x = L.sata[i-1];//存被删元素的值115     for(int j = i; j<L.n; j++)//依次前移,填补116         L.data[j-1] = L.data[j];117     L.n--;  //表长度减1118     return 1;//删除成功119 }120 121 122 123 124 //举例125 //集合的并运算的实现126 void Merge(SeqList& LA, SeqList& LB)127 {128     //合并顺序表LA和LB,结果存于LA,重复元素只留一个129     int n=Length(LA), m=Length(LB), i, k, x;130     for(i=1; i<=m; i++)131     {132         x = LB.data[i-1];//在LB中取一元素133         k = Search(LA, x);//在LA中查找它134         if(k == 0)//若在LA中未找到则将它插入到LA中135         {136             Insert(LA, n+1, x);//插入到第n个元素后137             n++;138         }139     }140 }
141 //集合的交运算的实现
142 void Intersection(SeqList& LA, SeqList& LB)
143 {
144     //求顺序表LA和LB中的共有元素,结果存于LA
145     int n=Length(LA), m=Length(LB), i=1, k, x;
146     while(i <= n)
147     {
148         x = LA.data[i-1]; //在LA取一元素
149         k = Search(LB, x);//在LB中查找它
150         if(k == 0)//若在LB中未找到则从LA中删除它
151         {
152             Remove(LA, i, x);//在LA中删除它
153             n--;
154         }
155         else
156             i++;
157     }
158 }