表现层(Presentation Layer):
表现层用于用户接口的展示,以及用业务层的类和对象来“驱动”这些接口。
业务层(Business Tier):
业务层用于访问数据层,从数据层取数据、修改数据以及删除数据,并将结果返回给表现层。
列表list
List是连续的容器,而数组vector是非连续的容器,即list将元素存储在连续的存储器中,而vector存储在不连续的存储器中。
vector中间的插入和删除代价很大,因为它需要大量的时间来移动所有的元素。list容器克服了这个问题,它是使用链表实现的。
List支持双向操作,并为插入和删除操作提供了一种有效的方法。
在列表中遍历速度很慢,因为列表元素是按顺序访问的,而vector支持随机访问。
创建List对象时,默认构造方法将调用如代码所示的统一初始化过程init(), 在列表
内部创建一对头、尾哨兵节点,并适当地设置其前驱、后继指针构成一个双向链表。
typedef struct Node{
int data;
struct *node next;
struct *node prev;
}Node;
typedef struct {
int size;
Node *head;
Node *tail;
}LinkList
头插法
Data *insert_head(int n) {
Data *head = (Data *)malloc(sizeof(Data));
head->next = NULL;
head -> prev = head;
Data *r = head -> next;
while (n--)
{
int tmp;
Data *p = (Data *)malloc(sizeof(Data));
scanf("%d", &tmp);
p -> data = tmp;
/*考虑头节点的next域为空,防止访第3步head->next->prev访问到空的指针*/
if (head -> next == NULL) {
p -> next = NULL;
p -> prev = head;
head -> next = p;
} else
{
p -> next = head -> next;
p -> prev = head;
head -> next -> prev = p;
head -> next = p;
}
}
return head -> next;
}
尾插法
void Insert_tail(DLinkList *& L,int a[],int n){
DLinkList * s, *r ; int i;
L = (DLinkList *)malloc(sizeof(DLinkList));
r = L; //将前后指针域置为空
for(int i = 0; i < n; i++){
s = (DLinkList *)malloc(sizeof(DLinkList));
s-data = a[i];
r->next = s;
s->prior = r;
r = s;
}
r->next = null;
}