双链表的初始化,插入,删除,遍历
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode {
int data;
struct LNode* next,* prior;
}LNode,*LinkList;
//初始化(有头节点)
bool InitList_H(LinkList& L) {
L = (LNode*)malloc(sizeof(LNode));
if (L == NULL)
return false;
L->next = NULL;
L->prior = NULL;
return true;
}
LinkList ListTailInsert(LinkList& L) {
LNode* p, * t = L;
for (int i = 0; i < 5; i++) {
p = (LNode*)malloc(sizeof(LNode));
p->data = i;
t->next = p;
p->prior = t;
t = p;
}
t->next = NULL;
return L;
}
void print(LinkList L) {
LNode* p = L->next;
while (p != NULL) {
printf("The content is %d\n", p->data);
p = p->next;
}
}
bool InsertNextNode(LNode* p, LNode* q) {
if (p == NULL|| q == NULL) {
return false;
}
q->next = p->next;
if(p->next!=NULL)
p->next->prior = q;
q->prior = p;
p->next = q;
return true;
}
bool DeleteNode(LNode* p) {
if (p == NULL) {
return false;
}
LNode* q = p->next;
p -> next = q->next;
if (q->next != NULL)
q->next->prior = p;
free(q);
return true;
}
int LocateElem(LinkList L, int e) {
LNode* p = L;
while (p!=NULL&&p->data!=e) {
p = p->next;
}
if (!p)
return 999;
return e;
}
LNode* GetElem(LinkList L, int i) {
if (L == NULL||i<1)
return NULL;
int j = 0;
LNode* p = L->next;
while (p != NULL && j < i - 1) {
p = p->next;
j++;
}
return p;
}
int main() {
LinkList L;
if (InitList_H(L)) {
printf("The List was initialized successfully\n");
}
else {
printf("List initialization failed\n");
}
ListTailInsert(L);
printf("Before insertion\n");
print(L);
LNode* q = (LNode*)malloc(sizeof(LNode));
q->data = 7;
InsertNextNode(GetElem(L, 4),q);
printf("After insertion\n");
print(L);
DeleteNode(GetElem(L, 4));
printf("After delete\n");
print(L);
int x;
printf("Please enter the number you want to find\n");
scanf_s("%d", &x);
printf("The number is %d", LocateElem(L, x));
return 0;
}
结果: