4)线性表[顺序表和链表]

顺序表:

  1 #include<iostream>
  2 using namespace std;
  3 
  4 enum error{rangeerror,underflow,overflow,success};
  5 const int maxlen=1000;
  6 
  7 class list{
  8 public:
  9     list();
 10     int length()const;//求长度
 11     int get_int(const int i,int &x)const;//按序号取元素运算
 12     int locate(const  int x)const;//搜索元素运算对应的函数
 13     int insert(const int i,const int x);//插入元素运算对应的函数
 14     int dele(const int i);//删除元素运算对应的函数
 15 private:
 16     int data[maxlen];
 17     int count;
 18 };
 19 
 20 
 21 list::list(){//初始顺序表化
 22     count=0;
 23 }
 24 
 25 int list::length()const{//求表长度的实现
 26     return count;
 27 }
 28 
 29 int list::get_int(const int i,int &x)const{//按序号求元素
 30     if(i<=0||i>count)return underflow;
 31     else {
 32         x=data[i-1];
 33         return success;
 34     }
 35 }
 36 
 37 int list::locate(const int x)const{//查找元素
 38     bool flags=false;
 39     for(int i=0;i<count;i++){
 40         if(data[i]==x){
 41             flags=true;
 42             return i+1;
 43             break;
 44         }
 45     }
 46     if(flags==false)return -1;
 47 }
 48 
 49 int list::insert(const int i,const int x){//插入元素
 50     if(count==maxlen)return overflow;//溢出,不能插入
 51     if(i<1||i>length()+1)return rangeerror;//插入范围有错
 52     else {
 53         for(int j=count-1;j>=i-1;j--){
 54             data[j+1]=data[j];
 55         }
 56         data[i-1]=x;
 57         count++;
 58         return success;
 59     }
 60 }
 61 
 62 
 63 int list::dele(const int i){//删除元素
 64     int j;
 65     if(length()==0)return underflow;
 66     if(i<1||i>length())return rangeerror;
 67     else {
 68         for(j=i+1;j<=length();j++){
 69             data[j-2]=data[j-1];
 70         }
 71         count--;
 72         return success;
 73     }
 74 }
 75 
 76 
 77 bool subset(list A,list B){//判断集合A是否是集合B 的子集
 78     int ia,ib,x,y;
 79     bool flags;
 80     bool suc=true;
 81     for(ia=0;ia<A.length();ia++){
 82         A.get_int(ia+1,x);
 83         flags=false;
 84         for(ib=0;ib<B.length();ib++){
 85             B.get_int(ib+1,y);
 86             if(x==y){
 87                 flags=true;
 88                 break;
 89             }
 90         }
 91         if(flags==false){
 92             suc=false;
 93             break;
 94         }
 95     }
 96     return suc;
 97 }
 98 
 99 
100 void merge_list(list A,list B, list &C){//顺序表A,B合并
101     int ia=0,ib=0,ic=1;
102     int x,y;
103     while(ia<A.length()&&ib<B.length()){
104         A.get_int(ia+1,x);
105         B.get_int(ib+1,y);
106         if(x==y){
107             C.insert(ic,x);
108             ic++;
109             ia++;
110             C.insert(ic,y);
111             ic++;
112             ib++;
113         }else if(x>y){
114             C.insert(ic,y);
115             ic++;
116             ib++;
117         }else {
118             C.insert(ic,x);
119             ic++;
120             ia++;
121         }
122     }
123 
124     while(ia<A.length()){
125         A.get_int(ia+1,x);
126         C.insert(ic,x);
127         ic++;
128         ia++;
129     }
130     while(ib<B.length()){
131         B.get_int(ib+1,y);
132         C.insert(ic,y);
133         ic++;
134         ib++;
135     }
136 
137     int i;
138     for(i=0;i<C.length();i++){
139         C.get_int(i+1,x);
140         cout<<x<<" ";
141     }
142     cout<<endl;
143         
144 }
145 int main(){
146     list A,B,C;
147     A.insert(1,1);
148     A.insert(2,3);
149     A.insert(3,5);
150     A.insert(4,7);
151     A.insert(5,9);
152     A.insert(6,11);
153     A.insert(7,13);
154     B.insert(1,3);
155     B.insert(2,4);
156     B.insert(3,6);
157     B.insert(4,8);
158     B.insert(5,10);
159     B.insert(6,12);
160     B.insert(7,14);
161     B.insert(8,15);
162 
163     int x,i;
164     for( i=0;i<A.length();i++){
165     A.get_int(i+1,x);
166     cout<<x<<" ";
167     }
168     cout<<endl;
169 
170 
171     for( i=0;i<B.length();i++){
172     B.get_int(i+1,x);
173     cout<<x<<" ";
174     }
175     cout<<endl;
176 
177     merge_list(A,B,C);
178 /*    for( i=0;i<C.length();i++){
179     C.get_int(i+1,x);
180     cout<<x<<" ";
181     }
182     cout<<endl;*/
183     //cout<<subset(A,B)<<endl;
184     return 0;
185 }

 

链表:

  1 #include <iostream>
  2 using namespace std;
  3 
  4 
  5 enum error{rangeerror,overflow,underflow,success};
  6 struct node{
  7     int data;
  8     node *next;
  9 };
 10 
 11 class list{
 12 public:
 13     list();
 14     int length() const;//求长度的函数
 15 //    ~list();//释放链表存储空间的析构函数
 16     int get_int(const int i ,int & x)const;//按序号取元素运算函数
 17     int locate(const  int x)const;//搜索元素运算对应的函数
 18     int insert(const int i,const int x);//插入元素运算对应的函数
 19     int dele(const int i);//删除元素对应的函数]
 20     void  create();//创建链表
 21     node *get_head(){return head;}
 22     bool Judge();//判断链表L中的元素是否为递增的
 23     void copy(list A,list &B);//复制链表A中的内容到B表中
 24 private:
 25     int count;
 26     node * head;
 27 };
 28 
 29 
 30 list::list(){//初始化对应的构造函数
 31     head =new node;
 32     head->next=NULL;
 33     count=0;
 34 }
 35 
 36 int list::length() const{//求长度
 37     return count;
 38 }
 39 
 40 int list::get_int(const int i,int &x)const{//按序号取元素
 41     node *p=new node;
 42     p=head->next;
 43     int j=1;
 44     while(p!=NULL&&j!=i){//当前节点不是目标节点,并且不空时就继续搜索
 45         p=p->next;
 46         j++;
 47     }
 48     if(p==NULL)return rangeerror;
 49     else {
 50         x=p->data;
 51         return success;
 52     }
 53 }
 54 
 55 int list::locate(const int x)const{//搜索元素运算对应的函数
 56     bool flags=false;
 57     int j=1;
 58     node *p = new node;
 59     while(p!=NULL){
 60         if(p->data==x){
 61             cout<<"元素所在的位置为:"<<j<<endl;
 62             flags=true;
 63             break;
 64         }else{
 65             j++;
 66             p=p->next;
 67         }
 68     }
 69     if(flags==false)return -1;
 70     return 0;
 71 }
 72 
 73 
 74 int list::insert(const int i,const int x){//插入元素
 75     node *p=new node;
 76     p=head;
 77     int j;
 78     j=0;
 79     while(j!=i-1&&p!=NULL){
 80         p=p->next;
 81         j++;
 82     }
 83 
 84     if(i<1||i>count+1)return rangeerror;
 85     node *s = new node;//产生节点
 86     s->data=x;//装入数据
 87     s->next=p->next;
 88     p->next=s;
 89     count++;
 90     return success;
 91 }
 92 
 93 
 94 int list::dele(const int i){//删除元素
 95     node * p=new node;
 96     p=head;
 97     int j=0;
 98     while(j!=i-1&&p!=NULL){
 99         p=p->next;
100         j++;
101     }
102 
103     if(i<1||i>count+1)return rangeerror;
104     node *u=new node;
105     u=p->next;
106     p->next=u->next;
107     delete u;
108     count--;
109     return success;
110 }
111 
112 
113 void list::create(){//创建链表
114     int x;
115     cin>>x;
116     node * rear=head;
117     while(x!=0){
118         count++;
119         node *s=new node;
120         s->data=x;
121         rear->next=s;
122         rear=s;
123         rear->next=NULL;
124         cin>>x;
125     }
126 }
127 
128 bool list::Judge(){//用于判断链表是否为递增的
129     node *p=new node;
130     p=head;
131     bool flags=true;
132     while(p->next!=NULL){
133         if(p->data<p->next->data)p=p->next;
134         else {
135             flags=false;
136             break;
137         }
138     }
139     return flags;
140 }
141 
142 void list::copy(list A,list &B){
143     node *pa=new node;
144     node *pb=new node;
145     pa=A.get_head()->next;
146     pb=head;
147     while(pa!=NULL){
148         node * s = new node;
149         s->data=pa->data;
150         pb->next=s;
151         pb=s;
152         B.count++;
153         pa=pa->next;
154         pb->next=NULL;
155     }
156 }
157 int main()
158 {
159     list l;
160     l.create();
161     int i,x;
162     for(i=0;i<l.length();i++){
163         l.get_int(i+1,x);
164         cout<<x<<" ";
165     }
166 
167     cout<<endl;
168 
169     cout<<l.Judge()<<endl;
170 /*    l.insert(5,10);
171     for(i=0;i<l.length();i++){
172         l.get_int(i+1,x);
173         cout<<x<<" ";
174     }
175 
176     cout<<endl;
177 
178     l.dele(2);
179         for(i=0;i<l.length();i++){
180         l.get_int(i+1,x);
181         cout<<x<<" ";
182     }
183 
184     cout<<endl;
185     */
186 
187     return 0;
188 }

 

posted @ 2015-12-05 18:47  指间ゝ繁华初逝的格调  阅读(192)  评论(0编辑  收藏  举报