在写过单链表之后再来写双链表会发现,双链表和单链表在实现上的主要区别在于:双链表每个节点需要考虑她的前驱和后继,因此在插入和删除操作的时候就需要格外注意对链表最后一个元素的操作,因为最后一个元素的next指向的是NULL,所以在写插入和删除操作的时候需要判断是不是对最后一个节点操作。
#include <iostream>
#include <stdlib.h>
using namespace std;
typedef struct LNode
{
int data;
struct LNode *pev;
struct LNode *next;
}LNode, *LinkList;
LinkList initLinkList(LinkList &L);
bool append(LinkList &L, int val);
bool insert(LinkList &L, int val, int i);
int getLength(LinkList &L);
int del(LinkList &L,int i);
void printList(LinkList &L);
LinkList initLinkList(LinkList &L)
{
L = (LinkList)malloc(sizeof(LNode));
L->data = 1;
L->pev = L;
L->next = NULL;
return L;
}
bool append(LinkList &L, int val)
{
LNode *s, *p;
p = L;
while(p->next != NULL)
{
p = p->next;
}
s = (LinkList)malloc(sizeof(LNode));
s->data = val;
p->next = s;
s->pev = p;
s->next = NULL;
return true;
}
bool insert(LinkList &L, int val, int i)
{
LNode *s, *p;
if(i < 1 || i > getLength(L) + 1) return false;
if(i == (getLength(L) + 1)) append(L,val);
else
{
p = L;
while(i--)
{
p = p->next;
}
s = (LinkList)malloc(sizeof(LNode));
s->data = val;
s->next = p;
p->pev->next = s;
s->pev = p->pev;
p->pev = s;
}
return true;
}
int getLength(LinkList &L)
{
int cnt = 1;
LNode *pointer;
if(L->next == NULL) return 0;
pointer = L->next;
while(pointer->next != NULL)
{
cnt++;
pointer = pointer->next;
}
return cnt;
}
int del(LinkList &L, int i)
{
LNode *p;
int num;
if(i < 1 || i > getLength(L)) return 9999;
if(i == getLength(L))
{
p = L;
while(i--)
{
p = p->next;
}
p->pev->next = NULL;
num = p->data;
free(p);
p = NULL;
}
else
{
p = L;
while(i--)
{
p = p->next;
}
p->pev->next = p->next;
p->next->pev = p->pev;
num = p->data;
free(p);
p = NULL;
}
return num;
}
void printList(LinkList &L)
{
LNode *pointer;
if(L->next == NULL) return;
pointer = L;
while(pointer->next != NULL)
{
pointer = pointer->next;
cout<<pointer->data<<"->";
}
cout<<"end"<<endl;
}
int main()
{
LNode *L;
initLinkList(L);
cout<<"Length: "<<getLength(L)<<endl;
append(L,100);
append(L,200);
insert(L,300,1);
insert(L,400,1);
insert(L,500,4);
printList(L);
cout<<"Length: "<<getLength(L)<<endl;
cout<<del(L,6)<<endl;
printList(L);
cout<<"Length: "<<getLength(L)<<endl;
return 0;
}
贴上运行结果
Length: 0
400->300->100->500->200->end
Length: 5
9999
400->300->100->500->200->end
Length: 5