head.h文件
#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef char datatype[20];
typedef struct Node
{
datatype data;
struct Node *next;
struct Node *prev;
}*DoubleLink;
DoubleLink create_node(); //创建节点
// 头插
DoubleLink insert_head(datatype e,DoubleLink l);
// 输出
void outpus(DoubleLink l);
// 尾插
DoubleLink insert_real(datatype e,DoubleLink l);
// 头删
DoubleLink del_head(DoubleLink l);
// 尾删
DoubleLink del_real(DoubleLink l);
//逆置
DoubleLink inversion(DoubleLink l);
#endif
main.c文件
#include "head.h"
int main(int argc, const char *argv[])
{
DoubleLink l=NULL;
int n;
printf("please enter n:");
scanf("%d",&n);
datatype e;
for(int i=0;i<n;i++)
{
printf("please enter e:");
scanf("%s",e);
// l=insert_head(e,l);
l=insert_real(e,l);
}
l=inversion(l);
outpus(l);
return 0;
}
test.c文件
#include "head.h"
DoubleLink create_node() //创建节点
{
DoubleLink node=(DoubleLink)malloc(sizeof(struct Node));
if(NULL==node)
{
return NULL;
}
//对新节点的数据域赋值
strcpy(node->data,"");
//对指针域赋值
node->next=node->prev=NULL;
return node;
}
// 输出
void outpus(DoubleLink l)
{
//判断链表是否为空
if(l==NULL)
return;
//正向遍历
puts("正向遍历");
while(l->next!=NULL)
{
printf("%s ",l->data);
l=l->next;
}
printf("%s\n",l->data);
//逆向遍历
/* puts("逆向遍历");
while(l!=NULL)
{
printf("%s ",l->data);
l=l->prev;
}
printf("\n");*/
}
// 头插
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_real(datatype e,DoubleLink l)
{
DoubleLink s=create_node();
if(NULL==s)
{
return l;
}
strcpy(s->data,e);
if(NULL==l)
{
l=s;
return l;
}
DoubleLink real=l;
while(real->next!=NULL)
real=real->next;
real->next=s;
s->prev=real;
return l;
}
// 头删
DoubleLink del_head(DoubleLink l)
{
if(l==NULL)
return l;
if(l->next==NULL)
{
free(l);
l=NULL;
return l;
}
else if(l->next->next==NULL)
{
DoubleLink q=l->next;
strcpy(l->data,q->data);
l->next=l->prev;
free(q);
q=NULL;
return l;
}
else
{
DoubleLink q=l->next;
strcpy(l->data,q->data);
l->next=q->next;
q->next->prev=l;
free(q);
q=NULL;
return l;
}
}
// 尾删
DoubleLink del_real(DoubleLink l)
{
if(NULL==l)
return l;
if(NULL==l->next)
{
free(l);
l=NULL;
return l;
}
else
{
DoubleLink real=l;
while(real->next!=NULL)
real=real->next;
real->prev->next=NULL;
free(real);
real=NULL;
return l;
}
}
//逆置
DoubleLink inversion(DoubleLink l)
{
if(NULL==l||L->next==NULL)
return l;
datatype t;
DoubleLink p=l;
while(l->next!=NULL)
l=l->next;
DoubleLink q=l;
l=p;
while(p!=q&&p->prev!=q)
{
strcpy(t,q->data);
strcpy(q->data,p->data);
strcpy(p->data,t);
p=p->next;
q=q->prev;
}
return l;
}
结果为: