数据结构之线性表

Posted Jeson

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构之线性表相关的知识,希望对你有一定的参考价值。

  1 //线性表的顺序表示。。。
  2 #include <cstdio>
  3 #include <iostream>
  4 using namespace std;
  5 const int list_size = 100;
  6 const int ex_size = 10;
  7 typedef struct{
  8     int *h,size;
  9 }sqlist;
 10 void init(sqlist &l){//初始化线性表
 11     l.h = new int[list_size + 1];
 12     *l.h = 0;
 13     l.size = list_size;
 14 }
 15 void ex_list(sqlist &l){//增大线性表容量
 16     int len = *l.h;
 17     l.size += ex_size;
 18     int *p = new int[l.size];
 19     for(int i = 1; i <= len; ++i) p[i] = l.h[i];
 20     delete [] l.h;
 21     l.h = p;
 22 }
 23 bool empty(sqlist &l){//判断线性表是否为空
 24     if(*l.h == 0) return true;
 25     return false;
 26 }
 27 void destroy(sqlist &l){//销毁线性表(其实就是释放空间。。)
 28     if(l.h != NULL) delete [] l.h;
 29     l.size = 0;
 30 }
 31 void clear(sqlist &l){//清空线性表
 32     *l.h = 0;
 33 }
 34 void display(sqlist &l){//打印线性表
 35     if(empty(l)){
 36         cout << "The linear table is empty!" << endl;
 37         return;
 38     }
 39     for(int *p = l.h + 1; p <= l.h + *l.h; ++p)
 40         cout << *p << " ";
 41     cout << endl;
 42 }
 43 void merge_list(int *a, int l, int m, int r, int *t){//归并排序step2
 44     int i = l, j = m + 1, x = m, y = r, k = 0;
 45     while (i <= x && j <= y)
 46         if (a[i] < a[j]) t[k++] = a[i++];
 47         else t[k++] = a[j++];
 48     while (i <= x) t[k++] = a[i++];
 49     while (j <= y) t[k++] = a[j++];
 50     for (i = 0; i < k; ++i)
 51         a[l + i] = t[i];
 52 }
 53 void merge_sort(int *a, int l, int r,int *t){//归并排序step1
 54     if (l >= r) return;
 55     int mid = (l + r) / 2;
 56     merge_sort(a, l, mid, t);
 57     merge_sort(a, mid + 1, r, t);
 58     merge_list(a, l, mid, r, t);
 59 }
 60 void sort(sqlist &l){//归并排序
 61     int *t = new int[l.size];
 62     merge_sort(l.h, 1, *l.h, t);
 63     delete [] t;
 64 }
 65 void merge(sqlist &l1,sqlist &l2,sqlist &l3){//合并线性表1和线性表2到线性表3
 66     if(l3.size <= *l1.h + *l2.h){
 67         delete [] l3.h; l3.size = *l1.h + *l2.h + ex_size;
 68         l3.h = new int[*l1.h + *l2.h + ex_size];
 69     }
 70     *l3.h = *l1.h + *l2.h;
 71     int *i = l1.h + 1, *j = l2.h + 1, *k = l3.h + 1;
 72     while(i <= l1.h + *l1.h && j <= l2.h + *l2.h)
 73         if(*i < *j) *k++ = *i++;
 74         else *k++ = *j++;
 75     while(i <= l1.h + *l1.h) *k++ = *i++;
 76     while(j <= l2.h + *l2.h) *k++ = *j++;
 77 }
 78 bool insert(sqlist &l,int i,int x){//插入操作
 79     if(i < 1 || i > *l.h + 1) return false;
 80     if(*l.h + 1 >= l.size) ex_list(l);
 81     for(int *j = l.h + *l.h + 1; j > l.h + i; --j) *j = *(j-1);
 82     *(l.h + i) = x;
 83     ++(*l.h);
 84     return true;
 85 }
 86 bool del(sqlist &l,int i){//删除操作
 87     if(i < 1 || i > *l.h) return false;
 88     for(int *j = l.h + i + 1; j <= l.h + *l.h; ++j) *(j-1) = *j;
 89     --*l.h;
 90     return true;
 91 }
 92 int get(sqlist &l,int i){//返回第i个元素
 93     return *(l.h + i);
 94 }
 95 int *locate(sqlist &l,int i){//定位i在第位置,以指针形式返回
 96     for(int *p = l.h + 1; p <= l.h + *l.h; ++p)
 97         if(*p == i) return p;
 98     return NULL;
 99 }
100 int *binary_locate(sqlist &l,int i){//二分定位,只能对已排序的线性表进行定位
101     int x = 1, y = *l.h;
102     while(x <= y){
103         int *p = l.h + (x+y)/2;
104         if(*p == i) return p;
105         else if(*p < i) x = (x+y)/2 + 1;
106         else y = (x+y)/2 - 1;
107     }
108     return NULL;
109 }
110 int *prior(sqlist &l, int x){//返回x的前驱的指针
111     for(int *p = l.h + 1; p < l.h + *l.h; ++p)
112         if(*(p+1) == x) return p;
113     return NULL;
114 }
115 int *next(sqlist &l, int x){//返回x的后继的指针
116     for(int *p = l.h + 2; p <= l.h + *l.h; ++p)
117         if(*(p-1) == x) return p;
118     return NULL;
119 }
120 //以下为方便输出的函数。。。主要是控制格式和输出数据
121 void print_star(int x){
122     cout << "*****************************" << endl;
123     if(x) cout << endl << endl;
124 }
125 void print_inf(sqlist &l,int i){
126     cout << "线性表 " << i << " :长度为:" << *l.h << "  容量为:" << l.size << endl;
127 }
128 void print_list(sqlist &a,sqlist &b,sqlist &c){
129     cout << endl;
130     cout << "-------线性表  1 数据-------" << endl; display(a);
131     cout << "-------线性表  2 数据-------" << endl; display(b);
132     cout << "-------线性表  3 数据-------" << endl; display(c);
133     cout << endl;
134 }
135 void print_information(sqlist &a,sqlist &b,sqlist &c){
136     print_list(a,b,c); print_inf(a,1); print_inf(b,2); print_inf(c,3);cout << endl;
137 }
138 int main(){
139     cout << endl; print_star(0);
140     cout << "-------建立顺序线性表-------" << endl;
141     sqlist a,b,c; init(a); init(b); init(c);
142     print_information(a,b,c);
143     cout << "-------线性表建立成功-------" << endl;
144     print_star(1); print_star(0);
145     cout << "-------数据插入与删除-------" << endl << endl;
146     cout << "-------数据的插入操作-------" << endl;
147     for(int i = 1; i < 11; ++i)
148         insert(a,i,11-i);
149     for(int i = 1; i < 11; ++i)
150         insert(b,i,i);
151     print_information(a,b,c);
152     cout << "-------数据插入成功!-------" << endl << endl;
153     cout << "-------数据的删除操作-------" << endl;
154     del(a,1); del(b,1); del(c,1);
155     print_information(a,b,c);
156     cout << "-------数据删除成功!-------" << endl;
157     print_star(1); print_star(0);
158     cout << "-------数据的相关查询-------" << endl;
159     cout << "线性表1中第1个元素为:" << get(a,1) << endl;
160     cout << "线性表1中第一个6在第 " << locate(a,6) - a.h << endl;
161     cout << "线性表1中5的前驱为:" << *prior(a,5) << endl;
162     cout << "线性表1中5的后继为:" << *next(a,5) << endl;
163     cout << "-------数据查询完毕!-------" << endl;
164     print_star(1); print_star(0);
165     cout << "-------数据的归并排序-------" << endl;
166     cout << "初始数据:" << endl;
167     print_information(a,b,c);
168     sort(a); sort(b);
169     cout << "排序后数据:" << endl;
170     print_information(a,b,c);
171     cout << "排序后可以使用二分查找进行定位,如下:" << endl;
172     cout << "线性表1中第一个6在第 " << binary_locate(a,6) - a.h << endl;
173     cout << "-------数据排序完毕!-------" << endl;
174     print_star(1); print_star(0);
175     cout << "-------多组数据的合并-------" << endl;
176     merge(a,b,c);
177     print_information(a,b,c);
178     cout << "-------数据合并成功!-------" << endl;
179     print_star(0);
180     return 0;
181 }

 

以上是关于数据结构之线性表的主要内容,如果未能解决你的问题,请参考以下文章

常见数据结构之线性表

数据结构之线性表之顺序存储Java实现

[DataStructure]非线性数据结构之哈希表二叉树及多叉树 Java 代码实现

数据结构之顺序线性表

数据结构与算法之----线性表

数据结构之线性表再思考