双向链表(C语言)

双向链表(C语言)

  一:初始化以及创建:

struct Node {
    int data;
    Node* prior;
    Node* next;
};

int Init(Node* L) {//初始化
    Node* temp = (Node*)malloc(sizeof(Node));
    if (!L)
        return  -1;
    L->prior = NULL;//前面是指针引进,所以不需要使用指针符号来指向
    L->next = NULL;
}

int CreateNewData(Node* L) {//创建新表
    int n;
    Node* p = L;
    printf("请输入你要输入的个数
");
    scanf("%d", &n);

    for (int i = 1; i <= n; i++) {
        Node* q = (Node*)malloc(sizeof(Node));
        p->next = q;
        printf("请输入第%d个元素的值", i);
        scanf("%d", &q->data);

        q->prior = p;//主要元素仍然是p,而p也只是暂时存在为内存地址分配对应的值的
        q->next = NULL;
        p = q;
    }
    return 0;
}

  二:插入以及删除操作

int InsertData(Node* L, int num, int elem) {
    Node* p, * q;
    int i;
    p = L;
    for (int i = 1; i < num; i++) {
        p = p->next;
    }
    q = (Node*)malloc(sizeof(Node));
    if (q) {//这里需要好好琢磨一下,比较难理解的
        q->data = elem;
        p->next->prior = q;
        q->next = p->next;
        p->next = q;
        q->prior = p;
    }
    return 0;
}

int DeleData(Node* L, int num) {
    Node* p, * q;
    //需要的就是把需要删除的位置跳过去就可以了,同时释放那个内存所占用的空间
    p = L->next;
    q = L;
    for (int i = 1; i < num; i++) {
        p = p->next;
        q = q->next;
    }
    p->next->prior = q;
    q->next = p->next;
    free(p);
    return 0;
}

  附加图示理解:

  三:双向链表遍历:

void print(Node *L)    {//输出双向链表的所有的元素
    Node *p;
    p=L->next;

    while(p!=NULL)
    {
        printf("%d ",p->data);
        p=p->next;
    }
}
原文地址:https://www.cnblogs.com/instead-everyone/p/13700308.html