C++双向链表及操作

其实会了单向链表,写双向链表其实是一样的。最重要的是,其实链表之间相连的理解不应该简简单单地理解为p -> next = L诸如此类的,因为p -> next的->也是一种指针,不过是内部指针。所以并不是p指向L,而是p地址中存放的那个结构体中存放的next地址指向了L。详情可以看http://blog.csdn.net/qq_36523667/article/details/79016795中画的图,从内存角度去理解。


typedef int ElemType;

 

struct Node {

ElemType data;

struct Node*pre;

struct Node *next;

}Node, *LinkedList;

 

LinkedList initEmptyLinkedList() {

Node *L;

L = (* Node)malloc (sizeof(Node));

if (L == null)

    printf(“分配内存空间失败”);

   return NULL;

L -> pre =null;

L -> next =null;

return L;

}

 

LinkedList createFromHead() {

Node *L;

L = (* Node)mallloc(sizeof(Node));

if (L = null) {

    printf(“分配内存空间失败”);

   return NULL;

}

L -> pre = NULL;

L -> next = NULL;

while(scanf(“%d”,&x) != EOF) {

    Node*n;

    n = (*Node) malloc (sizeof(Node));

    if(n == NULL) {

       printf(“分配内存空间失败”);//其实这里应该释放所有分配的节点,因为已错了

       return L;

    }

    n -> pre = NULL;

    n -> next =NULL;

 

        n -> next = L -> next;

        L -> next = n;

        n -> pre = L;

        L -> next -> pre = n;

}

return L;

}

 

LinkedList createFromEnd() {

Node *L;

L = (Node *)malloc (sizeof(Node));

if (L = NULL) {

   printf(“分配内存空间失败”);

    return NULL;

}

L -> pre =NULL;

L -> next=NULL;

 

Node *cur;

cur = L;

 

while(scanf(“%d”,&x) != EOF) {

    Node*n;

    n = (*Node) malloc (sizeof(Node));

    if(n == NULL) {

        printf(“分配内存空间失败”);

       return L;

    }

    n-> pre = NULL;

    n-> next = NULL;

   

    cur-> next = n;

    n-> pre = cur;

 

    cur =n;

}

}

 

LinkedList insertLinkedList(LinkedList L,int i, ElemType data) {

Node *cur;

cur = L;

 

int tempi;

for(tempi = 1;tempi< i; tempi ++) {

    cur =L -> next;

}

 

Node *n;

n = (* Node)malloc(sizeof(Node));

n -> data =data;

n -> pre =NULL;

n -> next=NULL;

 

cur -> next ->pre = n -> next;

n -> next =cur -> next;

cur -> next =n;

n -> pre =cur;

 

return L;

}

 

Boolean deleteLinkedList(LinkedList L,ElemType data) {

Node *cur;

cur = L;

 

while (true) {

    if (cur= NULL) {

       printf(“没找到”);

        returnfalse;

    }

    if (cur-> data = data) {

       cur -> next -> pre = cur -> pre;

            cur -> pre -> next = cur->next;

            free(cur);

        returntrue;

    }else {

        cur = cur -> next;

    }

}

 

return L;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值