头定义:
typedef char datatype[20];//datatype==char[20]
typedef struct Node
{
//数据域 数据元素
datatype data;
//指针域 下一个节点地址
struct Node* next;
//指针域 上一个节点地址
struct Node* prev;
}*DoubleLink;
创建节点:
DoubleLink create_node()
{
DoubleLink node=(DoubleLink)malloc(sizeof(struct Node));
if(NULL==node)
return NULL;
//对新节点的数据域初始化
strcpy(node->data,"");
//对指针域赋值 NULL
node->next=node->prev=NULL;
return node;
}
节点的头插
DoubleLink insert_head(datatype e,DoubleLink L)
{
DoubleLink s=create_node();
if(NULL==s)
return L;
strcpy(s->data,e);
if(NULL!=L)
{
s->next=L;
L->prev=s;
}
L=s;
return L;
}
节点的尾插:
DoubleLink insert_rear(DoubleLink L,datatype e)
{
//创建新节点s
DoubleLink s=create_node();
if(NULL==s)
return L;
strcpy(s->data,e);
//链表为空
if(NULL==L)
{
L=s;
return L;
}
DoubleLink rear=L;
while(rear->next!=NULL)
{
rear=rear->next;
}
rear->next=s;
s->prev=rear;
return L;
}
节点的头删:
DoubleLink delete_head(DoubleLink L)
{
if(L==NULL)
return L;
if(L->next==NULL)
{
free(L);
L=NULL;
return L;
}
DoubleLink q=L->next;
strcpy(L->data,q->data);
L->next=q->next;
if(q->next!=NULL)
q->next->prev=L;
free(q);
q=NULL;
return L;
}
节点的尾删:
DoubleLink delete_rear(DoubleLink L)
{
if(L==NULL)
return L;
if(L->next==NULL)
{
free(L);
L=NULL;
return L;
}
DoubleLink rear=L;
while(rear->next!=NULL)
{
rear=rear->next;
}
rear->prev->next=NULL;
free(rear);
rear=NULL;
return L;
}
节点的逆置:
DoubleLink rev_double(DoubleLink L,int n)
{
if(L==NULL||L->next==NULL)
return L;
DoubleLink p=L;
L=L->next;
p->next=NULL;
DoubleLink t;
printf("%d",n);
for(int i=0;i<n-1;i++)
{
t=L;
L=L->next;
t->next=p;
p->prev=t;
t->prev=NULL;
p=t;
}
return p;
}
节点的输出(含正向遍历输出和反向遍历输出)
void output(DoubleLink L)
{
//判断链表是否为空
if(NULL==L)
return;
//正向遍历
printf("正向遍历\n");
while(L->next!=NULL)
{
printf("%s ",L->data);
L=L->next;
}
printf("%s\n",L->data);
//逆向遍历
printf("逆向遍历\n");
while(L!=NULL)
{
printf("%s ",L->data);
L=L->prev;
}
puts("");
}