C语言 双链表 插入 翻转
# include <stdio.h>
# include <stdlib.h>
typedef struct LNode{
int data;
struct LNode *prev;
struct LNode *next;
}Node, *NodeList;
// 初始化
bool InitList(NodeList &L) {
// 头节点
L = (Node *)malloc(sizeof(Node));
if (L==NULL) {
return false;
} else {
return true;
}
}
// 判断空表
bool EmptyList(NodeList &L) {
if (L->next==NULL) {
return true;
}else {
return false;
}
}
// 表长度
int Length(NodeList &L) {
Node *head = L->next;
int ll = 0;
while(head!=NULL) {
head=head->next;
ll++;
}
return ll;
}
// 在第k个位置插入元素e
bool addList(NodeList &L, int k, int e) {
// 判断k是否合法
int ll = Length(L);
if ((k<1)||(k>ll+1)) {
return false;
}else {
// 新建空间
Node *cc = (Node *)malloc(sizeof(Node));
cc->data = e;
// 空表插入元素
if (EmptyList(L)) {
L->next = cc;
cc->prev = NULL;
cc->next = NULL;
return true;
}else {
// 设置指针 遍历位置
Node *head = L;
if (k==1) {
// 前指针
cc->prev = NULL;
// 后指针
cc->next = head->next;
// 后节点前指针
head->next->prev = cc;
// 前节点后指针
head->next = cc;
return true;
}else {
for (int i=0;i<k-1;i++){
head=head->next;
}
if (head->next==NULL) {
// 前指针
cc->prev = head;
// 后指针
cc->next = NULL;
// 后节点前指针
// 前节点后指针
head->next = cc;
return true;
}else {
// 新元素前指针
cc->prev = head;
// 后指针
cc->next = head->next;
// 后节点前指针
head->next->prev = cc;
// 前节点后指针
head->next = cc;
return true;
}
}
}
}
}
// 打印双链表
void outputList(NodeList &L) {
// 判断空表
if (EmptyList(L)) {
printf("\n此表是空表拒绝打印\n");
} else {
Node *head = L->next;
while(head!=NULL) {
int kk = head->data;
printf("%d -> ", kk);
head = head->next;
}
}
}
// 反向遍历链表 验证链表前后指针是否正确
void ergList(NodeList &L) {
// 找尾结点
Node *end = L->next;
Node *kk = NULL;
while (end!=NULL) {
kk = end;
end = end->next;
}
printf("尾数据: %d\n", kk->data);
// 反向遍历链表验证插入
while((kk!=NULL)) {
int ddd = kk->data;
printf("%d -> ", ddd);
kk = kk->prev;
}
}
int main() {
// 初始化
NodeList L;
InitList(L);
// 判断空表
if(EmptyList(L)) {
printf("这是一个空表\n");
}
int ll = Length(L);
printf("表长度为:%d", ll);
outputList(L);
// 写入一个元素
printf("第1个位置插入999元素");
if (addList(L, 1, 999)) {
printf("插入成功\n");
}else{
printf("插入失败\n");
}
outputList(L);
// 写入一个元素
printf("第1个位置插入888元素");
if (addList(L, 1, 888)) {
printf("插入成功\n");
}else{
printf("插入失败\n");
}
outputList(L);
// 写入一个元素
printf("\n第3个位置插入777元素");
if (addList(L, 3, 777)) {
printf("插入成功\n");
}else{
printf("插入失败\n");
}
outputList(L);
// 写入一个元素
printf("\n第1个位置插入333元素");
if (addList(L, 1, 333)) {
printf("插入成功\n");
}else{
printf("插入失败\n");
}
outputList(L);
// 验证
printf("\n翻转验证: \n");
ergList(L);
}