#include<stdlib.h>
#include<stdio.h>
typedef struct LNode{
int data;
struct LNode *prior;
struct LNode *next;
}LNode,*LinkList;
LinkList InitList(LinkList &L){
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
L->prior = NULL;
return L;
}
LNode* CreateNode(int data){
LNode* node = (LNode*)malloc(sizeof(LNode));
node->next = NULL;
node->data = data;
node->prior = NULL;
return node;
}
//头插法创建链表
LinkList CreateListHead(LinkList &L){
L = InitList(L);
int x;
printf("请输入数字(9999表示结束):\n");
scanf("%d",&x);
LNode *P;
while(x!=9999){
P = CreateNode(x);
if(!L->next){
P->next=NULL;
P->prior=L;
L->next=P;
}else{
L->next->prior=P;
P->next = L->next;
P->prior = L;
L->next = P;
}
scanf("%d",&x);
}
return L;
}
//尾插法
LinkList CreateListTail(LinkList &L){
L = InitList(L);
LNode *tail = L;
LNode *P;
int x;
printf("请输入数字(9999表示结束):\n");
scanf("%d",&x);
while(x!=9999){
P = CreateNode(x);
while(tail->next)
tail = tail->next;
P->next = NULL;
P->prior = tail;
tail->next = P;
scanf("%d",&x);
}
return L;
}
//指定元素插入链表
LinkList InserList(LinkList &L,int pos,int x){
if(!L||!L->next) return NULL;
if(pos<0) return NULL;
LNode *p=L,*s;
int i=0;
while(p&&i<pos){
p=p->next;
i++;
}
if(!p || i!=pos) return NULL;
s = CreateNode(x);
s->next = p;
s->prior = p->prior;
p->prior->next = s;
p->prior = s;
return L;
}
// 删除头结点
LinkList delHeadNode(LinkList &L){
if(!L) return NULL;
LNode *P = L->next;
P->next->prior = L;
L->next = P->next;
free(P);
return L;
}
// 删除尾节点
LinkList delTailNode(LinkList &L){
if(!L) return NULL;
LNode *P = L->next;
while(P->next)
P=P->next;
P->prior->next = NULL;
free(P);
return L;
}
// 遍历双向链表
void print_list(LinkList L){
L = L->next;
while(L){
printf("%d ",L->data);
L=L->next;
}
}
// 反向遍历双向链表
void ReversePrintlist(LinkList L){
LNode *p = L;
while(p->next)
p = p->next;
while(p&&p->prior){
printf("%d ",p->data);
p=p->prior;
}
}
int main(){
LinkList L1,L2;
printf("使用头插法创建双向链表:\n");
CreateListHead(L1);
print_list(L1);
printf("\n");
printf("使用为尾插法创建双向链表:\n");
CreateListTail(L2);
print_list(L2);
printf("\n");
printf("将【88】插入L2链表中的第【2】位置上:\n");
InserList(L2,2,88);
print_list(L2);
printf("\n");
printf("逆向遍历链表:\n");
ReversePrintlist(L2);
printf("\n");
printf("删除链表L1的头结点\n");
delHeadNode(L1);
print_list(L1);
printf("\n");
printf("删除链表L2的尾结点\n");
delTailNode(L2);
print_list(L2);
printf("\n");
return 0;
}
C++双向链表操作
最新推荐文章于 2023-09-28 12:49:11 发布