数据结构:双链表的增删改查

 1、单链表注意后面插入的情况,如果是最后一个元素,那么它没有下一个节点的前驱;

2、插入:(1)先写该节点的前驱和后继;

                (2)再写该节点的前驱的后继;

                (3)在写该节点的后继的前驱;

3、删除:(1)注意最后一个节点,如果是最后一个节点,它没有后继的前驱

                   (2)如果是中间节点,写前驱的后继和后继的前驱;

 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct
{
  int  no;
  char name[31];
}ElemType;

typedef struct LNode
{
  ElemType data;
  struct LNode *next;
  struct LNode *prior;
}LNode,*LinkList;

LNode *InitList1();
int  PushFront(LinkList LL, ElemType *ee);
int  PushBack(LinkList LL, ElemType *ee);
void PrintList(LinkList LL);
void InsertForwardElem(LinkList LL,int number,ElemType *ee);
void InsertBehindElem(LinkList LL,int number,ElemType *ee);
void deleteElem(LinkList LL,int number);
void ChangeData(LinkList LL,int data1,int data2);
int main()
{
    LNode* LL = NULL;
    LL = InitList1();
    ElemType ee;
    char name[256]={0};
    for(int i=1;i<=10;i++)
    {
        char name[256]={0};
        sprintf(name,"hcc[%d]",i);
        ee.no=i;strcpy(ee.name,name);
        //PushFront(LL,&ee);
        PushBack(LL,&ee);
    }
    PrintList(LL);
    //ee.no=100;strcpy(ee.name,"zhangsan");
    //InsertForwardElem(LL,5,&ee);
   // PrintList(LL);
  //  InsertBehindElem(LL,11,&ee);
   // PrintList(LL);
    deleteElem(LL,10);
    PrintList(LL);

   /* ChangeData(LL,10,1000);
    PrintList(LL);

    ClearList(LL);
    DestroyList(LL);
    LL = NULL;
    printf("LL =NULL\n");
    PrintList(LL);*/
    return 0;
}

LNode *InitList1()
{
    LNode* head = (LNode*)malloc(sizeof(LNode));
    if(head == NULL)
        return NULL;
    head->next=NULL;
    head->prior=NULL;
    return head;
}

int  PushFront(LinkList LL, ElemType *ee)
{
    if(LL==NULL||ee==NULL) return -1;
    LNode* tmp = (LNode*)malloc(sizeof(LNode));
    memcpy(&tmp->data,ee,sizeof(ElemType));
    tmp->next = LL->next;
    tmp->prior = LL;
    if(LL->next != NULL) tmp->next->prior = tmp;
    LL->next = tmp;
    return 0;
}

int  PushBack(LinkList LL, ElemType *ee)
{
    if(LL==NULL||ee==NULL) return -1;
    LNode* tmp = (LNode*)malloc(sizeof(LNode));
    memcpy(&tmp->data,ee,sizeof(ElemType));
    while(LL->next !=NULL)
    {
        LL=LL->next;
    }
    tmp->next=LL->next;
    tmp->prior = LL;
    LL->next =tmp;
    return 0;
}

void PrintList(LinkList LL)
{
    if(LL == NULL) return;
    LNode* tmp =LL->next;
    while(tmp !=NULL)
    {
        printf("tmp:%p tmp.prior=%p tmp.next =%p no:%d name:%s\n",tmp,tmp->prior,tmp->next,tmp->data.no,tmp->data.name);
        tmp = tmp->next;
    }
    return ;
}

void InsertForwardElem(LinkList LL,int number,ElemType *ee)
{
    if(LL->next == NULL)
    {
        printf("not enough data\n");
        return ;
    }
    while(LL->next!=NULL)
    {
        if(LL->next->data.no == number)
        {
            LNode* tmp = (LNode*)malloc(sizeof(LNode));
            memcpy(&tmp->data,ee,sizeof(ElemType));
            tmp->next = LL->next;
            tmp->prior = LL;
            LL->next = tmp;
            tmp->next->prior = tmp;
            return;
        }
        LL = LL->next;
    }
    printf("no this data\n");
    return;
}

void InsertBehindElem(LinkList LL,int number,ElemType *ee)
{
    if(LL->next == NULL)
    {
        printf("not enough data\n");
        return ;
    }
    while(LL->next!=NULL)
    {
        if(LL->next->data.no == number)
        {
            LNode* tmp = (LNode*)malloc(sizeof(LNode));
            memcpy(&tmp->data,ee,sizeof(ElemType));
            tmp->next = LL->next->next;
            tmp->prior = LL->next;
            if(LL->next->next !=NULL) tmp->next->prior = tmp;
            LL->next->next = tmp;
            return;
        }
        LL = LL->next;
    }
        LL = LL->next;
    }
    printf("no this data\n");
    return;
}

void deleteElem(LinkList LL,int number)
{
    if(LL->next == NULL)
    {
        printf("not enough data\n");
        return ;
    }
    while(LL->next!=NULL)
    {
        if(LL->next->data.no == number)
        {
            LNode* tmp = LL->next;
            tmp->prior->next = tmp->next;
            if(tmp->next!=NULL) tmp->next->prior = LL;
            free(tmp);
            return;
        }
        LL = LL->next;
    }
    printf("no this data\n");
    return;
}

void ClearList(LinkList LL)
{
    LNode* tmp1 = LL->next;
    LNode* tmp2 =NULL;
    while(tmp1 !=NULL)
    {
        tmp2 = tmp1->next;
        free(tmp1);
        tmp1 = tmp2;
    }
    LL->next =NULL;
   printf("LL->next =NULL\n");
}

void DestroyList(LinkList LL)
{
    LNode* tmp = NULL;
    while(LL !=NULL)
    {
        tmp = LL->next;
        free(LL);
        LL = tmp;
    }
    //LL =NULL; LOCAL VAR SO NEED TO BE NULL OUTSIDE
}

void ChangeData(LinkList LL,int data1,int data2)
{
    if(LL==NULL || LL->next ==NULL) return;
    while(LL->next!=NULL)
    {
        if(LL->next->data.no == data1)
        {
            LL->next->data.no = data2;
            return;
        }
        LL = LL->next;
    }
    printf("no this data\n");
}


                                                                     

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值