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

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

#include<bits/stdc++.h>
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; i<n; i++)
    {
        scanf("%d",&value);
        Nodeptr NewNode=(Nodeptr)malloc(sizeof(NODE));
        if(NewNode==NULL)
        {
            printf("分配内存失败!\n");
            exit(-1);
        }
        NewNode->data=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&&i<pos-1)//将指针定位到第pos-1个节点,其中可能位置不存在
    {
        p=p->next;
        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&&i<pos-1)
    {
        p=p->next;
        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;
}
十字链表挖坑待填。有时间的话,就实现以下吧。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值