#include
#include
typedef struct dlnode //typedef声明,简称typedef,为现有类型创建一个新的名字,或称为类型别名,在结构体定义,还有一些数组等地方都大量的用到。
{
char data;
struct dlnode *prior,*next;//声明头指针,尾指针
} DLNode;
DLNode *CreateDlinklist() //创建一个循环链表
{
DLNode *q,*head;
char x;
head=(DLNode*)malloc(sizeof(DLNode));
head->prior = head;
head->next = head;
printf("输入数据:");
scanf("%c",&x);
while(x!='\n') //头插法
{
q=(DLNode*)malloc(sizeof(DLNode));//申请存储新结点的存储空间
q->data = x; //将读入的数据存入q
q->prior = head; // 新插入的结点其前驱是head
q->next = head->next;//q的后继结点是原来的head的后继结点
head->next->prior = q;//头结点的原后继结点的前驱结点现在为q
head->next = q;//头结点的现在后继结点 这里不能把这一句放在最前面,会造成原来链表的数据丢失
scanf("%c",&x);
}
return head; //返回头指针
}
DLNode *Get_Dlinklist(DLNode *head,int i)//查找结点
{
DLNode *p = head;
int j = 0;
while(p->next!=head&&i!= j)//按序号查找结点
{
p = p->next;
j++;
}
if(p->next!=head)
return p;//找到此节点就返回指向这个节点的指针
else
return NULL; //否则返回空
}
DLNode *Insert_Dlinklist(DLNode *head ,int i,char x)//在i位置上插入数值为x
{
DLNode *p ,*s;
p = Get_Dlinklist(head,i-1);//查找i-1的结点
if(p==NULL)
printf("第%d个节点不存在,非法操作!\n",i-1);
else
{
s=(DLNode*)malloc(sizeof(DLNode));//申请一个存储空间存储s
s->data = x;
s->prior = p;//新节点s的 前驱结点为p
s->next = p->next; //插入后s的后继结点现在为原结点的后继结点
p->next->prior = s;//原节点 的后继结点的前驱结点现在为s
p->next =s ;
//p的后继结点为s
}
}
void Del_DLinklist(DLNode *head,int i) //从第I个位置删除结点
{
DLNode *p;
p=Get_Dlinklist(head,i);
if(p==NULL)
{
printf("第i个数据不存在!\n",i);
}
else
{
p->prior->next = p->next; //p结点的前驱结点的后继结点为p结点的后继结点
p->next->prior = p->prior;//p节点的后继结点的前驱结点p结点的后继结点
free(p);//释放所占的空间 很重要
}
}
void Print(DLNode *h)//后项输出
{
DLNode * p;
p = h->next;
while(p!=h)
{
printf("%c",p->data);
p = p->next;
}
printf("\n");
}
void Print2(DLNode *h)//前向输出
{
DLNode * p;
p = h->prior;
while(p!=h)
{
printf("%c",p->data);
p = p->prior;
}
printf("\n");
}
int main()
{
DLNode *h,*p;
int i;
char x;
h = CreateDlinklist();
printf("前向输出双向链表:");
Print(h);
printf("后向输出双向链表:");
Print2(h);
printf("输入要查找元素的序号:");
scanf("%d",&i);
p = Get_Dlinklist(h,i) ;
if(p!= NULL)
printf("查找的元素为%c:",p->data);
else
printf("查找不到\n");
printf("\n");
printf("插入元素,输入要插入的位置以及元素值:");
scanf("%d,%c",&i,&x);
Insert_Dlinklist(h ,i,x);
printf("前向输出双向链表:");
Print(h);
printf("后向输出双向链表:");
Print2(h);
printf("删除元素,输入要删除的位置 :");
scanf("%d",&i);
Del_DLinklist(h,i) ;
Insert_Dlinklist(h ,i,x);
printf("前向输出双向链表:");
Print(h);
printf("后向输出双向链表:");
Print2(h);
return 0;
}