10.16
双向链表
include
using namespace std;
typedef struct DuLNode
{
int data;
struct DuLNode* prior;
struct DuLNode* next;
}DuLNode,*DuLinkList;
void initDuLinkList(DuLinkList&L)
{
L = new DuLNode;
L -> data = 0;
L->next = NULL;
L->prior = NULL;
}
int length = 0;
DuLinkList getElem(DuLinkList& L, int i, bool isInsert)
{
if (i < 1 || (isInsert ? (i > length + 1) : (i > length)))return NULL;
DuLinkList p = L->next;
int j = 1;
while (p && j < i)//后继节点 插入后节点在p前
{
p = p->next;
j++;
}
return p;
}
bool insert(DuLinkList& L,int i,int e)
{
DuLinkList p = getElem(L, i, true);
DuLinkList s = new DuLNode;
s->data = e;
if (p == NULL)
{
DuLinkList tail = L;
// 找到尾节点(头结点的next为空时,尾节点就是头结点)
while (tail->next != NULL)
tail = tail->next;
s->prior = tail; // 新节点前驱指向尾节点
s->next = NULL; // 新节点后继置空
tail->next = s; // 尾节点后继指向新节点
length++;
}
else
{
s->prior = p->prior;
p->prior->next = s;
s->next = p;
p->prior = s;
length++;
return true;
}
}
bool remove(DuLinkList& L,int i,int &e)
{
DuLinkList p = getElem(L, i, false);
if (p == NULL) // 第i个节点不存在
return false;
e = p->data;
p->prior->next = p->next;
// 若p不是尾节点,才调整后继节点的前驱指针(避免空指针访问)
if (p->next != NULL)
p->next->prior = p->prior;
delete p;
length--;
return true;
}
void print(DuLinkList& L)
{
DuLinkList p = L->next;
while (p)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
int main()
{
DuLinkList L;
initDuLinkList(L);
insert(L, 1, 2);
insert(L, 2, 6);
insert(L, 3, 9);
insert(L, 4, 15);
print(L);
int e;
remove(L, 2, e);
cout << "删除的元素:" << e << endl; // 输出:删除的元素:6
cout << "删除后链表:";
print(L); // 输出:删除后链表:2 9 15
return 0;
}
浙公网安备 33010602011771号