数据结构复习——线性表的链式存储实现(双向链表)

其实与单向链表大同小异,只是多了一个前驱指针。操作起来多了几个小步骤而已。

#include
using namespace std;
typedef struct Node * Nodeptr;
typedef struct Node
{
    int data;               //数据
    struct Node *pre,*next;     //指针
} NODE;                     //NODE等价于struct Node,Nodeptr等价于struct Node *
Nodeptr createLinklist()//创建
{
    int n,value;                                  //记录创建节点的个数和值
    Nodeptr Head=(Nodeptr)malloc(sizeof(Nodeptr));//创建头指针
    if(Head==NULL)                                //判断失败操作
    {
        printf("分配内存失败!\n");
        exit(-1);
    }

    Nodeptr p=Head;                               //指针p始终指向表尾
    Head->pre=NULL;

    printf("输入创建节点的个数:");
    scanf("%d",&n);
    for(int i=0; idata=value;      //值放入
        NewNode->pre=p;
        p->next=NewNode;           //指向新节点
        p=NewNode;                 //仍然让p指向末尾
    }
    p->next=NULL;

    return Head;
}


void traverseLinklist(Nodeptr Head)//遍历
{
    Nodeptr p=Head->next,q;
    while(p!=NULL)
    {
        printf("%d ",p->data);
        q=p;
        p=p->next;
    }
    printf("\n");
    while(q!=Head){
        printf("%d ",q->data);
        q=q->pre;
    }
    printf("\n");
    return ;
}


void insertElement(Nodeptr Head,int pos, int value)//插入
{
    //将值为value的元素插入到pos位置
    int i=0;
    Nodeptr p=Head;
    while(p!=NULL&&inext;
        i++;
    }
    if(p==NULL||i>pos-1)
    {
        printf("位置不存在!\n");
        return ;
    }
    Nodeptr NewNode=(Nodeptr)malloc(sizeof(Node));//分配内存
    if(NewNode==NULL)
    {
        printf("分配内存失败!\n");
        exit(-1);
    }
    NewNode->data=value;               //赋值

    Nodeptr q=p->next;              //指向下一个节点

    p->next=NewNode;
    NewNode->pre=p;

    NewNode->next=q;
    q->pre=NewNode;
    return ;
}

void deleteElement(Nodeptr Head,int pos)//删除
{
    //删除同上
    int i=0;
    Nodeptr p=Head;
    while(p!=NULL&&inext;
        i++;
    }
    if(p->next==NULL||i>pos-1)
    {
        printf("位置不存在!\n");
        return ;
    }
    Nodeptr q=p->next,t=q->next;//需要删除q

    if(t!=NULL){
        p->next=t;
        t->pre=p;
    }
    else p->next=t;

    free(q);
    q=NULL;
    return ;
}
int main()
{
    Nodeptr head=NULL;
    head=createLinklist();
    traverseLinklist(head);
    insertElement(head,3,10);
    traverseLinklist(head);
    deleteElement(head,3);
    traverseLinklist(head);
    return 0;
}
十字链表挖坑待填。有时间的话,就实现以下吧。

你可能感兴趣的:(数据结构)