#include <stdio.h>
#include <malloc.h>
typedef int ElemType; //对int数据类型进行命名
typedef struct DNode{
ElemType data;
struct DNode *prior; //指向前驱结点
struct DNode *next; //指向后继结点
}DLinkNode; //双链表结点的类型
void InitList(DLinkNode* &L){ //初始化双链表
L=(DLinkNode *)malloc(sizeof(DLinkNode));
L->prior=L->next=NULL;
}
void CreatListF(DLinkNode* &L,ElemType a[],int n){ //头插法进行插入
L=(DLinkNode *)malloc(sizeof(DLinkNode)); //创建头结点
L->prior=L->next=NULL; //对头结点的前后数据置为空
for(int i=0;i<n;i++){ //插入元素,n为元素的个数
DLinkNode *s;
s=(DLinkNode *)malloc(sizeof(DLinkNode)); //创造一个结点,来插入新的元素
s->data=a[i];
s->next=L->next; //将结点s插入在原开始结点的前面,头结点的后面(即每一次插入元素之前,都设置一个s->next的位置,将上一次插入的元素依次放在后面)
if(L->next!=NULL){ //将元素依次插入在头结点的后面
L->next->prior=s;
L->next=s;
s->prior=L;
}
}
}
void CreatListR(DLinkNode* &L,ElemType a[],int n){ //尾插法进行插入
DLinkNode *r;
L=(DLinkNode *)malloc(sizeof(DLinkNode)); //创建头结点
L->prior=L->next=NULL;
r=L; //r始终指向终端结点,开始=头结点,因为在插入数据之前头结点为NULL
for(int i=0;i<n;i++){
DLinkNode *s;
s=(DLinkNode *)malloc(sizeof(DLinkNode)); //创建一个s结点
s->data=a[i];
r->next=s; //将结点s插入在结点r之后
s->prior=r;
r=s; //每次s都会取代r,即每次插入后s都会变成尾结点
}
r->next=NULL; //尾结点的next与域值为NULL
}
void DestroyList(DLinkNode* &L){ //销毁线性表
DLinkNode *pre=L,*p=pre->next;
while(p!=NULL){
free(pre); //依次销毁p->next
pre=p;
p=pre->next;
}
free(p);
}
bool ListEmpty(DLinkNode* &L){
return(L->next==NULL);
}
int ListLength(DLinkNode *L){ //求线性表长度
DLinkNode *p=L->next;
int i=0;
while(p!=NULL){
i++;
p=p->next;
}
return(i);
}
void DispList(DLinkNode *L){ //输出线性表
DLinkNode *p=L->next;
if(p!=NULL){
printf("%c",p->data);
p=p->next;
}
printf("\n");
}
bool GetElem(DLinkNode *L,int i,ElemType &e){ //求线性表中的第i个元素
int j=0;
DLinkNode *p=L;
if(i<=0){
return false;
}
while(j<i&&p!=NULL){
j++;
p=p->next;
}
if(p=NULL){ //当没有查询到
return false;
}
else{
e=p->data;
return true;
}
}
int LocateElem(DLinkNode* L,ElemType &e){ //查找第一个值域e的元素序号
int i=1; //记录位置
DLinkNode *p=L->next;
while(p!=NULL&&p->data!=e){
i++;
p=p->next;
}
if(p==NULL){
return 0; //未找到
}
else{
return i;
}
}
bool ListInsert(DLinkNode* &L,int i,ElemType e){ //插入第i个元素
int j=0;
DLinkNode *p=L,*s; //p指向头结点,j设置为0
if(i<=0){
return false;
}
while(j<i-1&&p!=NULL){ //查找第i-1个结点p
j++;
p=p->next;
}
if(p==NULL){
return false;
}
else{
s=(DLinkNode *)malloc(sizeof(DLinkNode));
s->data=e;
s->next=p->next; //将结点s插入到p后
if(p->next!=NULL){
p->next->prior=s;
}
s->prior=p;
p->next=s;
return true;
}
}
bool ListDelete(DLinkNode* &L,int i,ElemType &e){//删除第i个元素
}
}