2023-03-28-双链表DLinklist基本操作

//双链表对钩

#include <stdio.h>
#include <stdbool.h>
#include <malloc.h>

typedef struct DNode
{
    int data;
    struct DNode *prior,*next;//prior指向上一个结点,next指向下一个结点
}DNode,*DLinkList;

bool InitList(DLinkList *L)//初始化双链表
{
    *L=(DNode *)malloc(sizeof(DNode));//新建一个头结点
    if(*L==NULL)//内存不足分配失败
    {
        return false;
    }
    else
    {
        (*L)->next=NULL;//将头结点的下一个节点设为NULL
        return true;
    }
}

DLinkList createDLinkList(DLinkList L)//尾插法建立双链表
{
    L=(DLinkList)malloc(sizeof(DNode));
    L->next=NULL;
    DNode *s;
    DNode *e=L;//e为表尾的结点,此时L就是最后的结点
    int value;
    scanf("%d",&value);
    while(value!=9999)
    { 
        s=(DNode *)malloc(sizeof(DNode));
        s->data=value;
        e->next=s;
        s->prior=e;//s的上一个结点指向e
        e=s;//将e指向s,即最后一个结点
        scanf("%d",&value);
    }
    return L;
}

DNode *GetElem(DLinkList L,int i)//按位查找结点
{
    DNode *p;//存放最后返回的结点
    p=L->next;//先从第一个结点开始遍历
    if(i==0)
    {
        return L;//第零个节点是头指针?头结点是第一个结点?
    }
    if(i<1)
    {
        return NULL;
    }
    int j=1;//此时p在第一个结点处
    while(p!=NULL && j<i)
    {
        p=p->next;//第一次循环,p遍历到第二个结点
        j++;
    }
    return p;//返回p结点
}

void DLinklist_insert(DLinkList L,int i,int value)//插入操作
{
    DNode *p;
    DNode *s = GetElem(L,i-1);//获取前一个结点
    p=(DNode *)malloc(sizeof(DNode));
    p->next=s->next;
    s->next->prior=p;
    p->prior=s;
    s->next=p;
    p->data=value;
}

void DLinklist_delete(DLinkList L,int i)//删除操作
{
    DNode *p=GetElem(L,i);
    p->prior->next=p->next;
    p->next->prior=p->prior;
    free(p);//不要忘记释放内存
}

int main()
{
    DLinkList L;
    InitList(&L);
    L = createDLinkList(L);
    DLinklist_insert(L,3,666);
    DLinklist_delete(L,3);
    printf("%d",GetElem(L,3)->data);
    return 0;
}
 

C++:

//双链表

#include <stdio.h>
#include <stdbool.h>
#include <malloc.h>

typedef struct DNode
{
    int data;
    struct DNode *prior,*next;//prior指向上一个结点,next指向下一个结点
}DNode,*DLinkList;

bool InitList(DLinkList &L)//初始化双链表
{
    L=(DNode *)malloc(sizeof(DNode));//新建一个头结点
    if(L==NULL)//内存不足分配失败
    {
        return false;
    }
    else
    {
        L->next=NULL;//将头结点的下一个节点设为NULL
        return true;
    }
}

DLinkList createDLinkList(DLinkList L)//尾插法建立双链表
{
    L=(DLinkList)malloc(sizeof(DNode));
    L->next=NULL;
    DNode *s;
    DNode *e=L;//e为表尾的结点,此时L就是最后的结点
    int value;
    scanf("%d",&value);
    while(value!=9999)
    { 
        s=(DNode *)malloc(sizeof(DNode));
        s->data=value;
        e->next=s;
        s->prior=e;//s的上一个结点指向e
        e=s;//将e指向s,即最后一个结点
        scanf("%d",&value);
    }
    return L;
}

DNode *GetElem(DLinkList L,int i)//按位查找结点
{
    DNode *p;//存放最后返回的结点
    p=L->next;//先从第一个结点开始遍历
    if(i==0)
    {
        return L;//第零个节点是头指针?头结点是第一个结点?
    }
    if(i<1)
    {
        return NULL;
    }
    int j=1;//此时p在第一个结点处
    while(p!=NULL && j<i)
    {
        p=p->next;//第一次循环,p遍历到第二个结点
        j++;
    }
    return p;//返回p结点
}

void DLinklist_insert(DLinkList L,int i,int value)//插入操作
{
    DNode *p;
    DNode *s = GetElem(L,i-1);//获取前一个结点
    p=(DNode *)malloc(sizeof(DNode));
    p->next=s->next;
    s->next->prior=p;
    p->prior=s;
    s->next=p;
    p->data=value;
}

void DLinklist_delete(DLinkList L,int i)//删除操作
{
    DNode *p=GetElem(L,i);
    p->prior->next=p->next;
    p->next->prior=p->prior;
    free(p);//不要忘记释放内存
}

int main()
{
    DLinkList L;
    InitList(L);
    L = createDLinkList(L);
    DLinklist_insert(L,3,666);
    DLinklist_delete(L,3);
    printf("%d",GetElem(L,3)->data);
    return 0;
}

 

posted @   正方形的被子  阅读(70)  评论(0编辑  收藏  举报
   
点击右上角即可分享
微信分享提示
主题色彩