带头结点的双链表
#include <stdio.h>
#include <iostream>
using namespace std;
typedef struct LNode{
int data = 0;
struct LNode *next;//后继指针
struct LNode *prior;//前驱指针
}LNode, *LinkList;
bool init_list(LinkList &L){
L = (LNode *)malloc(sizeof(LNode));
L->next = NULL;//后面判断要用到
L->prior = NULL;
return true;
}
void print_list(LinkList L){
LNode *p = L;
while (p!=NULL) {
cout << "data:" << p->data << endl;
p = p->next;
}
}
bool delete_next_node(LNode *p){
LNode *q;//临时变量会自动回收
q = p->next;
p->next = q->next;
if (q->next!=NULL) {
q->next->prior = p;
}
free(q);//指针指向的结点内存空间需要回收
return true;
}
LinkList head_insert(LinkList &L){
L = (LNode *)malloc(sizeof(LNode));
L->next = NULL;
L->prior = NULL;
// LNode *p = L;//尾巴指针
LNode *q;
int x;
scanf("%d", &x);
while(x!=999){
q = (LNode *)malloc(sizeof(LNode));
q->data = x;
q->next = L->next;
if (L->next!=NULL) {
L->next->prior = q;//末尾是null
}
q->prior = L;
L->next = q;
scanf("%d", &x);
}
cout << "first data:" << L->data << endl;
return L;
}
void destroy_list(LinkList &L){
while (L->next != NULL) {//带头结点专用判空方式
delete_next_node(L);
}
free(L);//释放头结点内存空间
L = NULL;//指针变量置空
}
int main()
{
std::cout << "hello world ..." << std::endl;
LinkList linklist = NULL;
init_list(linklist);
cout << sizeof(linklist) << endl;
cout << linklist << endl;
print_list(linklist);
head_insert(linklist);
print_list(linklist);
std::cout << "分割线 ..." << std::endl;
delete_next_node(linklist->next);
print_list(linklist);
destroy_list(linklist);
cout << "清表是否成功:" << (linklist==NULL) << endl;
return 0;
}
测试结果