zoukankan      html  css  js  c++  java
  • 数据结构之线性表

    1.线性表的顺序表示

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

    2.动态链表

      1 //动态链表(简单版。。。)
      2 #include <cstdio>
      3 #include <iostream>
      4 using namespace std;
      5 const int inf = 0x3f3f3f3f;
      6 typedef struct node{
      7     int x;
      8     struct node *next;
      9 }node, *head;
     10 head init(int x = 0){//初始化链表
     11     head h = new node;
     12     h->x = x;
     13     h->next = NULL;
     14     return h;
     15 }
     16 head tail(head &h){//返回尾部元素的头指针
     17     head p = h;
     18     while(p->next != NULL) p = p->next;
     19     return p;
     20 }
     21 bool empty(head &h){//判断是否为空
     22     if(h->x) return false;
     23     return true;
     24 }
     25 int length(head &h){//返回链表长度
     26     return h->x;
     27 }
     28 bool insert(head &h, int i, int x){//在i处插入x
     29     if(i < 1 || i > h->x + 1) return false;
     30     head p = h, t = init(x);
     31     for(int j = 1; j < i; ++j) p = p->next;
     32     t->next = p->next;
     33     p->next = t;
     34     ++h->x;
     35     return true;
     36 }
     37 head insert(head &h, head &p, int x){//在p处插入x,输入多个数据时用
     38     p->next = init(x); ++h->x;
     39     return p->next;
     40 }
     41 bool add(head &h, int x){//尾部插入x
     42     return insert(h, h->x + 1, x);
     43 }
     44 bool del(head &h, int i){//删除第i个元素
     45     if(i < 1 || i > h->x) return false;
     46     head t, p = h;
     47     for(int j = 1; j < i; ++j) p = p->next;
     48     t = p->next->next;
     49     delete p->next;
     50     p->next = t;
     51     --h->x;
     52     return true;
     53 }
     54 int *get(head &h, int i){//返回第i个元素
     55     head p = h;
     56     if(i < 1 || i > h->x) return NULL;
     57     for(int j = 0; j < i; ++j) p = p->next;
     58     return &(p->x);
     59 }
     60 void display(head &h){//display(h)打印长度+链表,display(h->next)打印链表
     61     if(empty(h)) return;
     62     head p = h;
     63     while(p != NULL){
     64         cout << p->x << " ";
     65         p = p->next;
     66     }
     67     cout << endl;
     68 }
     69 void input(head &h, int n){//在h链表中连续加入n个数
     70     if(n < 1) return;
     71     head p = tail(h);
     72     while(n--){
     73         int x;
     74         cin >> x;
     75         p = insert(h,p,x);
     76     }
     77 }
     78 void merge(head &h1, head &h2){//合并两个有序链表
     79     h1->x += h2->x;
     80     head p = h1, x = h1->next, y = h2->next;
     81     while(x && y){
     82         if(x->x < y->x) { p->next = x; x = x->next; p = x; }
     83         else { p->next = y; y = y->next; p = y; }
     84     }
     85     p->next = x ? x : y;
     86     delete h2;
     87 }
     88 void destroy(head &h){//毁灭链表
     89     if(!h) return;
     90     destroy(h->next);
     91     delete h;
     92     h = NULL;
     93 }
     94 int main(){
     95     head h = init();
     96     add(h,1); add(h,2); add(h,3); display(h);
     97     del(h,1); display(h); cout << *get(h,1) << endl;
     98     input(h,3); display(h);
     99     head t = init(); add(h,4);
    100     merge(h,t); display(h);
    101     return 0;
    102 }
    My_linklist.cpp
  • 相关阅读:
    微信分享功能开发代码整理
    js 完美兼容浏览器的复制功能
    linux 搭建svn服务器
    zendStudio安装Xdebug项目断点调试
    程序员开发常用英语词汇
    简单的一个远传采集并下载远传图片存储到本地示例
    form表单中经常用到的禁用获取值问题
    记录下url拼接的多条件筛选js
    better-scroll在vue中的使用
    移动端适配,引入lib-flexible,vue开发中将px转化为rem
  • 原文地址:https://www.cnblogs.com/qq188380780/p/7482390.html
Copyright © 2011-2022 走看看