• 严蔚敏版《数据结构 (C语言版)》和《数据结构题集》(二)——顺序表


    顺序表的基本操作

      1 #include <iostream>
      2 #include <stdio.h>
      3 #include <stdlib.h>
      4 #define MAXSIZE 1024
      5 //define和const的区别:
      6 //define 在编译预处理时进行替换,而const int limit=100,
      7 //这个常量limit是有类型的,占用存储单元,有地址,可以用指针指向它但是不能修改它。
      8 using namespace std;
      9 
     10 typedef int Elemtype;//根据具体需要可以更改基本数据类型,以起到一个通用性的作用
     11 
     12 typedef struct {
     13 Elemtype data[MAXSIZE];
     14 int length;//链表的长度
     15 }Seqlist;
     16 
     17 void initList(Seqlist &l){
     18 l.length=0;
     19 }
     20 int listLength(Seqlist &l){
     21 return l.length;
     22 }
     23 void getElem(Seqlist &l,int i,Elemtype &e){
     24 e=l.data[i-1];
     25 }
     26 int  locateElem(Seqlist &l,Elemtype e,int compare){
     27 switch (compare ){
     28 case 1:
     29 for (int i=0;i<l.length;i++){
     30 if (l.data[i]>e)
     31 return i+1;
     32 }
     33 break;
     34 case 0:
     35 for (int i=0;i<l.length;i++){
     36 if (l.data[i]==e)
     37 return i+1;
     38 }
     39 break;
     40 case -1:
     41 for (int i=0;i<l.length;i++){
     42 if (l.data[i]<e)
     43 return i+1;
     44 }
     45 break;
     46 printf ("没有符合compare()的元素的元素!
    ");
     47 }
     48 }
     49 int listInsert(Seqlist &l,int i,Elemtype e){
     50 //1.判断顺序表是否已满
     51 //2.判断插入位置i是否合适
     52 //3.顺序后移,插入
     53 //4.顺序表长度++
     54 if (l.length>=MAXSIZE){
     55 printf("full
    ");
     56 return 0;
     57 //上溢的两种解决方法:1、提示full 2、realloc扩容插入
     58 //Seqlist *p=l;
     59 //p=realloc(p,(MAXSIZE+1)*sizeof(Elemtype));
     60 }
     61 if (i<1||i>l.length+1){
     62 printf("position error
    ");
     63 return 0;
     64 }
     65 for (int j=l.length;j>i-1;j--){
     66 l.data[j]=l.data[j-1];
     67 }
     68 l.data[i-1]=e;
     69 l.length++;
     70 return 1;
     71 }
     72 int listDelete(Seqlist &l,int i,Elemtype &e){
     73 if (i<1||i>l.length){
     74 printf("position error
    ");
     75 return 0;
     76 }
     77 e=l.data[i-1];
     78 for (int j=i-1;j<l.length-1;j++){
     79 l.data[j]=l.data[j+1];
     80 }
     81 l.length--;
     82 return 1;
     83 }
     84 int displayList(Seqlist &l){
     85 if (l.length==0){
     86 printf ("void
    ");
     87 return 0;
     88 }
     89 for (int i=0;i<l.length;i++){
     90 printf ("%d ",l.data[i]);
     91 }
     92 printf ("
    ");
     93 }
     94 void readElem(Seqlist &l){
     95 int x;
     96 scanf ("%d",&x);
     97 int i=0;
     98 while (x!=-999&&i<MAXSIZE){
     99 l.data[i]=x;
    100 scanf ("%d",&x);
    101 i++;
    102 l.length++;
    103 }
    104 if (i==MAXSIZE-1){
    105 printf ("full
    ");
    106 }
    107 }
    108 int main()
    109 {
    110     Seqlist l;
    111     initList(l);
    112     displayList(l);
    113     readElem(l);
    114     displayList(l);
    115     printf("顺序表的长度为:%d
    ",listLength(l));
    116     int x;
    117     printf ("输入getelem的元素位置
    ");
    118     scanf ("%d",&x);
    119     Elemtype e;
    120     getElem(l,x,e);
    121     printf ("%d 
    ",e);
    122     int com;
    123     printf ("输入locateelem的compare
    ");
    124     scanf ("%d",&com);
    125     printf ("%d
    ",locateElem(l,e,com));
    126     printf ("输入listinsert的元素位置
    ");
    127     scanf ("%d",&x);
    128     listInsert(l,x,e);
    129     displayList(l);
    130     printf ("输入listdelete的元素位置
    ");
    131     scanf ("%d",&x);
    132     listDelete(l,x,e);
    133     printf ("%d 
    ",e);
    134     displayList(l);
    135     return 0;
    136 }

    这里写图片描述

    题目练习5道

     1 //-----------题目练习----------
     2 //求出L中值大于e的元素个数
     3 int biggerthane(Seqlist &l,Elemtype e){
     4 int count=0;
     5 for (int i=0;i<l.length;i++){
     6 if (l.data[i]>e)
     7 count++;
     8 }
     9 return count;
    10 }
    11 //删除L中所有值为e的元素
    12 //delete方法的多态
    13 int listDelete(Seqlist &l,int i){
    14 if (i<1||i>l.length){
    15 printf("position error
    ");
    16 return 0;
    17 }
    18 for (int j=i-1;j<l.length-1;j++){
    19 l.data[j]=l.data[j+1];
    20 }
    21 l.length--;
    22 return 1;
    23 }
    24 void deletee(Seqlist &l,Elemtype e){
    25 for (int i=0;i<l.length;i++){
    26 if (l.data[i]==e)
    27 listDelete(l,i+1);//传入的是位置而不是下标
    28 }
    29 }
    30 //非递减顺序表,插入e,保持有序性
    31 void insertOrderList(Seqlist &l,Elemtype e){
    32 //找到插入位置i
    33 int i=0;
    34 while (l.data[i]<e)
    35 i++;
    36 //跳出循环时data[i]>=e
    37 listInsert(l,i+1,e);
    38 }
    39 //顺序表L中删除第i个元素起的k个元素
    40 int deletek(Seqlist &l,int i,int k){
    41 //如果调用listDelete函数,效率低,不如改造
    42 if (i<1||i>l.length-1){
    43 printf("position error
    ");
    44 return 0;
    45 }
    46 for (int j=0;j<k;j++){
    47 l.data[i+j]=l.data[j+i+k];
    48 }
    49 l.length=l.length-k;
    50 return 1;
    51 
    52 }

    设A=(a1,…,am)和B=(b1,…,bn)均为有序顺序表,
    A’和B’分别为A和B中除去最大共同前缀后的子表(例如,
    A=(x,y,y,z,x,z),B=(x,y,y,z,y,x,x,z),则两者中最大
    的共同前缀为(x,y,y,z), 在两表中除去最大共同前缀后
    的子表分别为A’=(x,z)和B’=(y,x,x,z))。若A’=B’=空表,
    则A=B;若A’=空表,而B’≠ 空表,或者两者均不为空表,
    且A’的首元小于B’的首元,则A

     1 void Compare(Seqlist A, Seqlist B){
     2 while (A.data[0]==B.data[0]&&A.length>0&&B.length>0){
     3 listDelete(A,1);
     4 listDelete(B,1);
     5 }
     6 //不要B.length==A.length==0,因为
     7 //它计算 a==b 时,得出一个逻辑值0或者1 ,然后再用这个逻辑值去与0比较
     8 if (A.length==0&&B.length==0)
     9 printf("A=B");
    10 if ((A.length==0&&B.length!=0)||(A.length!=0&&B.length!=0&&A.data[0]<B.data[0]))
    11 printf ("A<B");
    12 if ((B.length==0&&A.length!=0)||(A.length!=0&&B.length!=0&&A.data[0]>B.data[0]))
    13 printf ("A>B");
    14 }

    2)

     1 char Compare(Seqlist A, Seqlist B){
     2 int i=0,j=0;
     3 while (i<A.length&&j<B.length){
     4 if (A.data[i]!=B.data[j]){
     5 if (A.data[i]>B.data[j])
     6 return '>';
     7 else
     8 return '<';
     9 }else {
    10 i++;j++;
    11 }
    12 }
    13 //跳出循环之后分三种情况
    14 if (i==A.length&&j==B.length)
    15 return '=';
    16 else if (i!=A.length)
    17 return '>';
    18 else
    19 return '<';
    20 }

    另一种顺序表–

      1 #include <iostream>
      2 #include <stdio.h>
      3 #include <stdlib.h>
      4 #define OVERFLOW -2
      5 #define LIST_INIT_SIZE 100
      6 #define LISTINCREMENT 10
      7 //严蔚敏版 顺序表的实现 算法2.3-2.7
      8 using namespace std;
      9 
     10 typedef int Elemtype;//根据具体需要可以更改基本数据类型,以起到一个通用性的作用
     11 
     12 typedef struct {
     13 Elemtype *data;//存储空间基址
     14 int length;//链表的长度
     15 int listsize;//当前分配的存储容量,sizeof()为单位
     16 }Seqlist;
     17 //算法2.3
     18 int  initList_Seq(Seqlist &l){
     19 l.data=(Elemtype *)malloc(sizeof(Elemtype)*LIST_INIT_SIZE);
     20 if (!l.data)//如果分配空间失败
     21 exit(OVERFLOW);
     22 //exit为C++的退出函数,声明于stdlib.h中,对于C++其标准的头文件为cstdlib,声明为
     23 //void exit(int value);
     24 //exit的功能为,退出当前运行的程序,并将参数value返回给主调进程。
     25 //在main中return v;的效果 与exit(v);相同。
     26 l.length=0;
     27 l.listsize=LIST_INIT_SIZE;
     28 return 1;
     29 }
     30 int compare(Elemtype a,Elemtype b){
     31 if  (a>b)
     32 return 1;
     33 else
     34 return 0;
     35 }
     36 //算法2.6
     37 int  locateElem(Seqlist &l,Elemtype e,int (*compare)(Elemtype,Elemtype)){
     38     int i=1;//第一个元素
     39     Elemtype *p=l.data;
     40     while (i<=l.length&&!(*compare)(*p++,e)) i++;
     41     if (i<l.length )
     42     return i;
     43     else
     44     return 0;
     45 }
     46 //算法2.4
     47 int listInsert_Seq(Seqlist &l,int i,Elemtype e){
     48 if (l.length>=l.listsize){
     49 printf("full
    ");
     50 Elemtype *newbase;
     51 newbase=(Elemtype *)realloc(l.data,(LIST_INIT_SIZE+LISTINCREMENT)*sizeof(Elemtype));
     52 if (!newbase) exit(OVERFLOW);
     53 l.listsize=l.listsize+LISTINCREMENT;
     54 }
     55 if (i<1||i>l.length+1){
     56 printf("position error
    ");
     57 return 0;
     58 }
     59 for (int j=l.length;j>i-1;j--){
     60 l.data[j]=l.data[j-1];
     61 }
     62 l.data[i-1]=e;
     63 l.length++;
     64 return 1;
     65 }
     66 //算法2.5
     67 int listDelete(Seqlist &l,int i,Elemtype &e){
     68 if (i<1||i>l.length){
     69 printf("position error
    ");
     70 return 0;
     71 }
     72 e=l.data[i-1];
     73 for (int j=i-1;j<l.length-1;j++){
     74 l.data[j]=l.data[j+1];
     75 }
     76 l.length--;
     77 return 1;
     78 }
     79 int displayList(Seqlist &l){
     80 if (l.length==0){
     81 printf ("void
    ");
     82 return 0;
     83 }
     84 for (int i=0;i<l.length;i++){
     85 printf ("%d ",l.data[i]);
     86 }
     87 printf ("
    ");
     88 }
     89 void readElem(Seqlist &l){
     90 int x;
     91 scanf ("%d",&x);
     92 int i=0;
     93 while (x!=-999&&i<l.listsize){
     94 l.data[i]=x;
     95 scanf ("%d",&x);
     96 i++;
     97 l.length++;
     98 }
     99 if (i==l.listsize-1){
    100 printf ("full
    ");
    101 }
    102 }
    103 int listLength(Seqlist &l){
    104 return l.length;
    105 }
    106 void getElem(Seqlist &l,int i,Elemtype &e){
    107 e=l.data[i-1];
    108 }
    109 //算法2.7
    110 void mergeList_Seq(Seqlist la,Seqlist lb,Seqlist &lc ){
    111 //不像链表一样,lc寄居在某一条链表之上;lc有个新的数组,因为插入删除操作太频繁
    112 initList_Seq(lc);
    113 int la_len=listLength(la);int lb_len=listLength(lb);
    114 int i=0,j=0,k=0;
    115 while (i<la_len&&j<lb_len){
    116 if (la.data[i]>lb.data[j]){
    117 listInsert_Seq(lc,k+1,lb.data[j]);
    118 j++;
    119 k++;
    120 }else {
    121 listInsert_Seq(lc,k+1,la.data[i]);
    122 i++;
    123 k++;
    124 }
    125 }
    126 while (j<lb_len){
    127 listInsert_Seq(lc,k+1,lb.data[j]);
    128 j++;
    129 k++;
    130 }
    131 while (i<la_len){
    132 listInsert_Seq(lc,k+1,la.data[j]);
    133 i++;
    134 k++;
    135 }
    136 
    137 }
    138 
    139 int main()
    140 {
    141     Seqlist la,lb,lc;
    142     initList_Seq(la);initList_Seq(lb);
    143     readElem(la);readElem(lb);
    144     displayList(la);displayList(lb);
    145     mergeList_Seq(la,lb,lc);
    146     displayList(lc);
    147 
    148     return 0;
    149 }
  • 相关阅读:
    查看PL/SQL编译时的错误信息
    Oracle字符集的查看查询和Oracle字符集的设置修改
    关于数字货币 韩国似乎在下一盘大棋
    上传图片如何对图片进行压缩canvas
    socket应用(vue、node.js、M站)
    web前端学习python之第一章_基础语法(二)
    从零开始 —— Canvas(一)
    前端必备之Node+mysql+ejs模版如何写接口
    浏览器缓存机制
    前端实现数组去重,如何高效快捷?
  • 原文地址:https://www.cnblogs.com/twomeng/p/9476526.html
Copyright © 2020-2023  润新知