双链表的结构及其操作
/**
* 作者:LinX 2017/6/9-
*
* 内容:双链表的结构以及操作
*
*/
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct DNode
{
ElemType data;
struct DNode *prior;
struct DNode *next;
}DNode,DLinkList;
/*基本操作*/
DNode* InitList(); //初始化双链表
void CreateListR(DNode* head,int n); //用尾插法创建有n个节点(除去头节点)的双链表
ElemType DelNode(DLinkList *L,int pos); //删除某个节点,并返回删除节点的数据
void InsList(DLinkList *L,int pos,ElemType e); // 插入数据为e的节点到pos后面的位置
int isEmpty(DLinkList* L); //判断双链表是否为空
DNode* findNode(DLinkList *L,int pos); //找到pos位置上的节点并返回
void printList(DLinkList* L); //打印双链表
int main()
{
DLinkList *L=InitList();
CreateListR(L,4);
printList(L);
InsList(L,2,10);
printList(L);
DelNode(L,4);
printList(L);
}
/*初始化节点*/
DNode* InitList()
{
DNode *head;
head=(DNode *) malloc (sizeof(DNode));
head->next=head;
head->prior=head;
}
/*删除指定位置的节点*/
ElemType DelNode(DLinkList *L,int pos)
{
DNode *p,*q;
if(isEmpty(L)==1)
{
printf("\n表空\n");
return;
}
p=findNode(L,pos-1);
printf("%d\n",p->data);
q=p->next;
p->next=q->next;
if(q->next!=NULL)
{
p=q->next->prior;
}
free(q);
}
/*找到pos位置上的节点并返回*/
DNode* findNode(DLinkList *L,int pos)
{
int i;
DNode *p;
p=L->next;
for(i=0;i<pos;i++)
{
p=p->next;
}
return p;
}
/*向pos位置后面插入数据为e的节点*/
void InsList(DLinkList *L,int pos,ElemType e)
{
DNode *s,*p;
if(isEmpty(L))
{
printf("\n空表\n");
return;
}
s=(DNode *)malloc(sizeof(DNode));
s->data=e;
s->next=NULL;
p=findNode(L,pos-1);
s->next=p->next;
p->next=s;
s->prior=p;
p->next->prior=s;
}
/*创建节点个数为n的双链表*/
void CreateListR(DNode* head,int n)
{
DNode *r,*s;
int i;
ElemType e;
r=head;
for(i=0;i<n;i++)
{
scanf("%d",&e);
s=(DNode *)malloc(sizeof(DNode));
s->data=e;
r->next=s;
s->prior=r;
r=s;
}
r->next=NULL;
}
/*打印双链表*/
void printList(DLinkList *L)
{
DNode* p;
if(isEmpty(L))
{
printf("\n空表\n");
return;
}
p=L->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
/*判空*/
int isEmpty(DLinkList* L)
{
if(L->next==L&&L->prior==L)
{
return 1;
}
return 0;
}