头定义:
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=node;
return node;
}
节点的头插:
DoubleLink insert_head(datatype e,DoubleLink L)//头插
{
DoubleLink s=create_node();
if(NULL==s)
return L;
strcpy(s->data,e);
DoubleLink rear;
if(NULL!=L)
{
rear=L->prev;
s->next=L;
L->prev=s;
rear->next=s;
s->prev=rear;
}
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->prev;
rear->next=s;
s->next=L;
L->prev=s;
s->prev=rear;
return L;
}
节点的头删:
DoubleLink delete_head(DoubleLink L)//头删
{
if(L==NULL)
return L;
if(L->next==L)
{
free(L);
L=NULL;
return L;
}
DoubleLink q=L->next;
strcpy(L->data,q->data);
L->next=q->next;
q->next->prev=L;
free(q);
q=NULL;
return L;
}
节点的尾删:
DoubleLink delete_rear(DoubleLink L)//尾删
{
if(L==NULL)
return L;
if(L->next==L)
{
free(L);
L=NULL;
return L;
}
DoubleLink rear=L->prev;
rear->prev->next=L;
L->prev=rear->prev;
free(rear);
rear=NULL;
return L;
}
节点的输出(正向遍历和反向遍历):
void output(DoubleLink L)//输出
{
//判断链表是否为空
if(NULL==L)
return;
//正向遍历
printf("正向遍历\n");
DoubleLink p=L;
while(L->next!=p)
{
printf("%s ",L->data);
L=L->next;
}
printf("%s\n",L->data);
//逆向遍历
printf("逆向遍历\n");
while(L!=p)
{
printf("%s ",L->data);
L=L->prev;
}
printf("%s",L->data);
puts("");
}