双链表的上手
双链表的较单链表操作初始化更复杂 操作更简单, 只是注意 删除操作要把下一个结点的pre指向被删除结点的上一个结点
#include<stdio.h>
#include<stdlib.h>
int MaxSize;
typedef struct Node{
int data;
struct Node *next;
struct Node *pre;
}Node,*DLinkList,*Position;
//尾插法
DLinkList DoublyLinkListTailIn(DLinkList L){
int X;
Node *P;
L = (DLinkList)malloc(sizeof(Node));
Node *r = L;
printf("请输入你双链表的长度:");
scanf("%d",&MaxSize);
for(int i = 1;i <= MaxSize;i++){
P = (DLinkList)malloc(sizeof(Node));//每次新增结点都要开辟一个新的内存空间
if(!P){
printf("aha!Out of space,biiiiiitch");
exit(0);
}
printf("请输入你的第%d个数的值:",i);
scanf("%d",&X);
P->data = X;//把数据放入该新结点
r->next = P;//把链表的尾结点指向该结点
P->pre = r;//把新结点的pre指向原尾结点
r = P;//r变成新链表的尾结点
}
r->next = NULL;//表示链表的终点,同时方便尾结点的insert操作
TravalDLL(L);
printf("\n");
return L;
}
//遍历并打印链表
TravalDLL(DLinkList L){
int i = 0;
Node *P = L->next;
printf("你的双链表是:");
while(i < MaxSize){
i++;
printf("%d ",P->data);
P = P->next;
}
}
//在某位置插入一个数据
DLinkList Insert_DLL(DLinkList L){
int p,x;
Node *r = L;
Node *P;
printf("请输入你要插入的数据位置:");
scanf("%d",&p);
printf("请输入你要插入的数据:");
scanf("%d",&x);
MaxSize++;
if(p>MaxSize){
printf("Do you know,you out of space again,aaaaaaasshole!!!");
exit(0);
}
for(int i = 1;i < p;i++){
r = r->next;
}
P = (Node *)malloc(sizeof(Node));
P->data = x;
if(r->next != NULL){
r->next->pre = P;
}
if(r->next == NULL)
P->next = NULL;
P->next = r->next;
P->pre = r;
r->next = P;
TravalDLL(L);
return L;
}
//输出前一个结点
DLinkList Find_previous(DLinkList L,int X){
Node *P = L;
while(P->data != X){
P = P->next;
}
DLinkList q = P->pre;
printf("第三个结点的前一个结点的数据为%d\n",q->data);
return q;
}
//删除一个结点
DLinkList Delete_data(DLinkList L){
int X;
Node *r;
Node *P = L->next;
printf("请输入你要删除的数据:");
scanf("%d",&X);
for(;P->data != X;P = P->next){
if(P->next == NULL){
printf("Not in the List!!!");
break;
}
}
if(P->next != NULL){
P->next->pre = r;//如果删除结点不是尾结点就要使该结点的下一个结点的pre指向该结点的上一个结点r
}
r = P->pre;
r->next = P->next;
free(P);//释放空间
MaxSize--;//输出不会出错
TravalDLL(L);
return L;
}
int main(){
DLinkList L,q;
L = DoublyLinkListTailIn(L);
q = Find_previous(L,3);
L = Insert_DLL(L);
L = Delete_data(L);
return 0;
}