链表可以说是最基本的数据结构,在常见的笔试,面试可能都会有涉及,本文是用数组来实现链表。
其代码实现如下
#include<iostream>
using namespace std;
class List{
private:
int maxSize;
int n;
int *list;
public:
List(int max);
~List(){delete []list;}
bool isEmpty(){return n==0;}
int length(){return n;}
int locate(int &x);//返回表中元素x的位置
bool retrieve(int k, int &x);//返回表中位置k,将之放入元素x
List& insert(int k,int x);//在位置k插入元素x
List& Delete(int k,int &x);//删除位置k的元素,将之存在x中]
void printList();
};
List::List(int max){
maxSize = max;
n = 0;
list = new int[maxSize];
}
int List::locate(int &x){
for(int i=0;i<n;i++)
if(list[i]==x) return i;
return -1;
}
bool List::retrieve(int k, int &x){
if(k<1||k>n) return false;
x = list[k];
return true;
}
List& List::insert(int k, int x){
//if(k<0||k>n) 此处应抛出异常
//if(n==maxSize) 此处应抛出异常
for(int i = n-1; i >= k; i++)
list[i+1] = list[i];
list[k] = x;
n++;
return *this;
}
List& List::Delete(int k, int &x){
if(retrieve(k, x)){
for(int i = k; i < n; i++)
list[i] = list[i+1];
n--;
return *this;
}
//else 在此抛出异常
}
void List::printList() {
for(int i=0; i < n; i++)
cout<<list[i]<<" ";
cout<<endl;
}
int main() {
List list(10);
list.insert(0,1);
list.insert(1,2);
list.insert(2,3);
int listLength = list.length();
list.printList();
cout<<"数组链表的长度为"<<listLength<<endl;
int delElement = 0;
list.Delete(1, delElement);
list.printList();
cout<<"删除元素后数组链表的长度为"<<list.length()<<" "
<<"删除的元素是"<<" "<<delElement<<endl;
return 0;
}
由于该算法相对简单,只是在某些部分进行简单注释。
用数组来实现链表的效率不是很高,如在进行插入和删除时至多需要移动n个元素,效率为O(n)。
明后天的博客内容为一笔画问题(即欧拉回路的算法),欢迎各位到时捧场。
其代码实现如下
#include<iostream>
using namespace std;
class List{
private:
int maxSize;
int n;
int *list;
public:
List(int max);
~List(){delete []list;}
bool isEmpty(){return n==0;}
int length(){return n;}
int locate(int &x);//返回表中元素x的位置
bool retrieve(int k, int &x);//返回表中位置k,将之放入元素x
List& insert(int k,int x);//在位置k插入元素x
List& Delete(int k,int &x);//删除位置k的元素,将之存在x中]
void printList();
};
List::List(int max){
maxSize = max;
n = 0;
list = new int[maxSize];
}
int List::locate(int &x){
for(int i=0;i<n;i++)
if(list[i]==x) return i;
return -1;
}
bool List::retrieve(int k, int &x){
if(k<1||k>n) return false;
x = list[k];
return true;
}
List& List::insert(int k, int x){
//if(k<0||k>n) 此处应抛出异常
//if(n==maxSize) 此处应抛出异常
for(int i = n-1; i >= k; i++)
list[i+1] = list[i];
list[k] = x;
n++;
return *this;
}
List& List::Delete(int k, int &x){
if(retrieve(k, x)){
for(int i = k; i < n; i++)
list[i] = list[i+1];
n--;
return *this;
}
//else 在此抛出异常
}
void List::printList() {
for(int i=0; i < n; i++)
cout<<list[i]<<" ";
cout<<endl;
}
int main() {
List list(10);
list.insert(0,1);
list.insert(1,2);
list.insert(2,3);
int listLength = list.length();
list.printList();
cout<<"数组链表的长度为"<<listLength<<endl;
int delElement = 0;
list.Delete(1, delElement);
list.printList();
cout<<"删除元素后数组链表的长度为"<<list.length()<<" "
<<"删除的元素是"<<" "<<delElement<<endl;
return 0;
}
由于该算法相对简单,只是在某些部分进行简单注释。
用数组来实现链表的效率不是很高,如在进行插入和删除时至多需要移动n个元素,效率为O(n)。
明后天的博客内容为一笔画问题(即欧拉回路的算法),欢迎各位到时捧场。