双向链表

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

typedef struct node
{
    int data;
    struct node *prior;
    struct node *next;
}NODE,*PNODE,*LINKLIST;

//初始化
void init(LINKLIST *list)
{
    *list = (PNODE)malloc(sizeof(NODE));
    (*list)->prior=NULL;//前驱
    (*list)->next=NULL;//后继
}

//插入 到第i个位置 i>=1
void insert(LINKLIST list,int i,int data)
{
    PNODE p = list,q;
    //将p移动到i-1个位置
    while(--i && p)
        p=p->next;
    assert(p);//防止i的位置不合法
    q = (PNODE)malloc(sizeof(NODE));//q为插入节点
    q->data = data;
    q->next=p->next;//插入节点的后继
    q->prior = p;//插入节点的前驱

    if(p->next)
        p->next->prior = q;
    p->next = q;

}

//删除
void del(LINKLIST list,int i,int *data)
{
    PNODE p = list,q;
    //将p移动到i-1个位置
    while(--i && p)
        p=p->next;
    assert(p && p->next);//防止i的位置不合法
    q = p->next;
    p->next = q->next;
    if(q->next)
        q->next->prior = p;
    free(q);
}

//添加
void add(LINKLIST list,int data)
{
    PNODE p=list,q;
    //将p移动到最后位置
    while(p->next)
        p=p->next;
    q = (PNODE)malloc(sizeof(NODE));//q为要添加的节点
    q->data = data;
    q->next = NULL;
    q->prior = p;
    p->next = q;
}

//清空
void clear(LINKLIST list)
{
    PNODE p=list,q;
    p=p->next;
    while(p)
    {
        q=p->next;
        free(p);
        p=q;
    }
    list->next=NULL;
}

//销毁
void destroy(LINKLIST *list)
{
    PNODE p=*list,q;
    while(p)
    {
        q=p->next;
        free(p);
        p=q;
    }
    *list=NULL;
}

//打印链表
void display(LINKLIST list)
{
    PNODE p =list;
    assert(p);
    while(p=p->next)
    {
        printf("%d ",p->data);
    }
    printf("
");
}

int main()
{
    int i,data;
    LINKLIST list;
    init(&list);
    for(i=1;i<=5;i++)
        add(list,i);
    insert(list,6,100);
    display(list);
    destroy(&list);
    system("pause");
    return 0;
}
原文地址:https://www.cnblogs.com/dzqdzq/p/3404210.html