双链表的基本操作--创建,插入,删除,查找

  • 都挺简单的,就是要注意,无论单链表还是双链表,删除时都要遵循先链后断
  • 双链表插入和删除时,指针可直接移到要插入或者的位置,不用像单链表一定要移到其前驱结点,因为双链表每个结点自带前驱指针
#include <iostream>
#include<stdlib.h>
typedef struct DLNode{
    int data;
    struct DLNode *prior;
    struct DLNode *next;
}DLNode;

void createDLink(DLNode *&p,int arr[],int n){//创建双链表 
    int i;
    DLNode *r,*s,*q;
    p=(DLNode *)malloc(sizeof(DLNode));
    p->prior=NULL;
    p->next=NULL;
    r=p;
    for(i=0;i<n;i++){
        s=(DLNode *)malloc(sizeof(DLNode));
        s->data=arr[i];
        r->next=s;
        s->prior=r;
        r=s;
    }
    r->next=NULL;
}

int insert(DLNode *&p,int key,int pos){//插入结点(在第pos位置上插入key) 
    DLNode *r,*s,*q;
    int i,count=0;
    r=p;
    while(r->next!=NULL){
         count++;
         if(count==pos){
            q=r->next;//记录原来第pos位置上的结点 
            s=(DLNode *)malloc(sizeof(DLNode));
            s->data=key;
            r->next=s;//r后继指针连接新结点 
            s->next=q;//新结点后继指针连接原先结点 
            s->prior=r;//新结点前驱指针指向r 
            q->prior=s;
            return 1;
         }
         r=r->next;
    } 
    return 0;
}
int search(DLNode *q,int key){//查找结点,返回结点位置 
    DLNode *p=q->next;
    int count=0;
    while(p!=NULL){
        count++;
        if(p->data==key){
            return count;
        }
        p=p->next;
    }
    return 0;
}

int del(DLNode *&p,int key){//删除结点 
    DLNode *r,*s,*q,*l;
    int i;
    r=p->next;
    while(r!=NULL){//双链表删除结点就可直接让指针指向要删除的结点,依靠它有前驱指针搞定 
        if(r->data==key){
            q=r->prior;
            s=r->next;
            q->next=s;
            s->prior=q;
            free(r);
            break;
        }
        r=r->next;
    } 
}
void print(DLNode *p){//打印双链表 
    DLNode *q;
    q=p->next;
    while(q!=NULL){
        printf("%d ",q->data);
        q=q->next;
    } 
    printf("\n");
}
int main(int argc, char** argv) {
    DLNode *p;
    int arr[]={24,22,98,5,46};
    createDLink(p,arr,5);//创建链表 
    print(p);

    insert(p,408,3);//插入 
    print(p);

    del(p,98);
    print(p); 

    int n=search(p,5);
    if(n){
        printf("查找成功,在链表的第%d个位置\n",n);
    }else{
        printf("链表中没这个东西\n");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值