2022.2.6
双链表及其基本操作(只写了最重要的几个 其他的都可以由此衍生 关键操作就后插那一步 很简单 没必要多写别的了)
以后直接定义结构体指针来操作 传指针总比传结构体方便 而且看着舒服 并且以后尽量避免用双指针 花里胡哨的.....
(下一节 循环链表)
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#define length 100
#define ElemType int
typedef struct DLnode
{
ElemType data;
struct DLnode *next;
struct DLnode *prior;
}DLnode,*DlinkList;
//初始化函数
bool InitList(DLnode **L){
(*L)=(DLnode*)malloc(sizeof(DLnode)); //申请头结点空间
if(*L==NULL)
return false;
(*L)->next=NULL;
(*L)->prior=NULL;
(*L)->data=6;
return true;
}
//尾插法创表
bool CreateDlistR(DLnode **L){
DlinkList p=(*L);
DlinkList r=p;
int a;
printf("input elem,q to quit:\n");
while((scanf("%d",&a))==1){
DlinkList s=(DLnode *)malloc(sizeof(DLnode));
s->data=a;
r->next=s;
s->prior=r;
r=s;
}
r->next=NULL;
return true;
}
//插入结点算法 在p结点后插入s结点
bool InsertNextNode(DLnode *p,DLnode *s){
if(p==NULL||s==NULL)
return false;
s->next=p->next;
s->prior=p;
if(p->next!=NULL){ //若p不是最后一个结点在执行此操作 p为最后一个结点就不用
p->next->prior=s;
}
p->next=s;
return true;
}
//删除p结点的后继结点
bool DeleteNextNode(DLnode *p){
if(p==NULL)
return false;
DLnode *q=p->next;
if(q->next!=NULL){ //q不为最后一个结点在执行,否则不执行
q->next->prior=p;
}
p->next=q->next;
free(q);
return true;
}
//查找第一个值为x的结点并返回结点指针
DLnode * FindNode(DlinkList L,int x){
DLnode *s=L->next;
while(s!=NULL){
if(s->data==x)
return s;
else
s=s->next;
}
return NULL;
}
int main(){
DlinkList L;
InitList(&L);
CreateDlistR(&L);
}