2022.9.15实训笔记

67 阅读2分钟

表现层(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;
    }