双向链表和循环双向链表的基本操作
#include
#include
typedef struct LNode
{
int data;
struct LNode *prior;
struct LNode *next;
}LNode,*linkList;
//1.双向链表用尾插法建立链表,即将待插入的结点插在尾部位置
linkList CreateList(linkList L,int n)
{
linkList p,r;
L=(linkList)malloc(sizeof(LNode));//头结点
//双向循环链表:L->next=L->prior=L;
L->next=NULL;
L->prior=NULL;
r=L;
for(int i=0;idata));
r->next=p;
p->prior=r;
p->next=NULL;
r=p;
}
return L;
}
//2.输出链表
void ShowList(linkList L,int n)
{
linkList p;
int i=0;
p=L->next;
while(p&&idata);
p=p->next;
i++;
}
}
//3.链表长度
int Length(linkList L)
{
linkList p;
int l=0;
p=L->next;
while(p)
{
p=p->next;
l++;
}
return l;
}
//4.在双向链表中第i个位置插入值为e结点
linkList InsertList(linkList L,int i,int e)
{
linkList p,s;
int j=0;
p=L;
while(p&&jnext;
j++;
}
s=(linkList)malloc(sizeof(LNode));
s->data=e;
s->prior=p->prior;
p->prior->next=s;
s->next=p;
p->prior=s;
return L;
}
//5.删除双向链表第i位置的元素
linkList DeleteList(linkList L,int i)
{
linkList p;
int j=0;
p=L;
while(p&&jnext;
j++;
}
p->prior->next=p->next;
p->next->prior=p->prior;
free(p);
return L;
}
int main()
{
linkList La;
linkList pa;
int n,len;
printf("input the length of list a:");
scanf("%d",&n);
pa=CreateList(La,n);
len=Length(pa);
printf("n");
printf("the list length is %d n",Length(pa));
ShowList(pa,len);
//在链表La的第3个位置插入值为9的结点后输出链表//
pa=InsertList(pa,3,9);
len=Length(pa);
printf("链表La的3个位置插入值为9n");
printf("the inserted list length is %d n",Length(pa));
ShowList(pa,len);
//在删除链表La的第三个位置的元素
pa=DeleteList(pa,3);
len=Length(pa);
printf("删除链表第三个位置元素:n");
printf("the delete list length is %d n",Length(pa));
ShowList(pa,len);
}