c语言实现双向链表

元旦日,当然是用来学习咯

#include <stdio.h>
#include <stdlib.h>


typedef struct LINK {
    struct LINK *prior;
    int data;
    struct LINK *next;
}link;

//初始化双向链表
link * initial()
{
    //创建一个结点
    link *head = (link*)malloc(sizeof(link));
    head->prior = NULL;
    head->data = 1;
    head->next = NULL;

    link *list = head;
    for (int i = 2; i <= 3; i++) {
        link * temp = (link*)malloc(sizeof(link));
        temp->prior = NULL;
        temp->data = i;
        temp->next = NULL;

        list->next = temp;
        temp->prior = list;
        list = list->next;
    }
    return head;
}


//添加数据
link *addElem(link *head, int add, int elem) {
    link *temp = head;
    link *ELEM = (link*)malloc(sizeof(link));
    ELEM->prior = NULL;
    ELEM->data = elem;
    ELEM->next = NULL;

    //找到add的位置
    if (add == 1)
    {
        ELEM->next = head;
        head->prior = ELEM;
        head = ELEM;
    }
    else
    {
        for (int i = 1; i < add - 1; i++)
            temp = temp->next;
        if (temp->next) {
            temp->next->prior = ELEM;
            ELEM->next = temp->next;
            temp->next = ELEM;
            ELEM->prior = temp;
        }
        else
        {
            temp->next = ELEM;
            ELEM->prior = temp;
        }
    }
    return head;

}
//删除数据
link *delELEM(link *head, int elem) {
    link *temp = head;
    //int flag = 0;
    while (temp) {
        if (temp->data == elem)
        {
            if (temp->prior && temp->next) {
                temp->prior->next = temp->next;
                temp->next->prior = temp->prior;
                free(temp);
                return head;
            }
            else if (temp->prior==NULL)
            {
                temp->next->prior = NULL;
                head = temp->next;
                free(temp);
                return head;
            }
            else if (temp->next == NULL)
            {
                temp->prior->next = NULL;
                free(temp);
                return head;
            }
        }
        temp = temp->next;
    }
    /*if (temp->data == elem && temp->next == NULL) {
        temp->prior->next = NULL;
        free(temp);
        return head;
    }*/

        printf("未找到%d\n", elem);
        return head;
}
//显示链表
void display(link *head) {
    link *temp = head;
    while (temp) {
        if (temp->next==NULL)
            printf("%d", temp->data);
        else
            printf("%d->", temp->data);

        temp = temp->next;
    }
    putchar('\n');
}

int main()
{
    puts("双向链表的世界!");
    puts("-------生成双向链表-----------");
    link *head = initial();
    display(head);

    int add, elem;
    printf("\n请输入您要添加的位置及其数据:\n");
    printf("位置:"); scanf("%d", &add);
    printf("数据:"); scanf("%d", &elem);
    puts("----------新的双向链表--------");
    head = addElem(head, add, elem);
    display(head);

    printf("\n请输入您要删除的数据:\n");
    printf("数据:"); scanf("%d", &elem);
    puts("---------新的链表--------");
    head = delELEM(head, elem);
    display(head);

    printf("\n by xj  \n");

    return 0;

}

双向链表的实现其实也只是指针的移动
、运行结果

希望自己2018年能保持学习热情

猜你喜欢

转载自blog.csdn.net/sinat_40477296/article/details/78945270