《数据结构》 2.3 循环链表
http://hncu.acmclub.com/index.php?app=problem_title&id=111&problem_id=1328
题目描述
双向链表是在结点中既保存了后一个结点指针又保存了前一个结点指针的链表。这种链表较单向链表而言能够快速查找某一结点的前后结点。下面给出双向链表的定义、插入以及删除算法描述。

图1:双向链表示例
(a)结点结构;(b)空的双向循环链表;(c)含有三个结点的双向循环链表

图2:双向链表的定义以及创建
双向链表在插入与删除时一定要注意其操作步骤的顺序。下面给出双向链表在插入与删除时的图示。

图3:双向链表插入与删除的图示
(a)双向链表的删除操作;(b)双向链表的插入操作

图4:双向链表的查找以及插入

图5:双向链表的删除操作
输入格式
输入数据只有一组,包含很多行。每行有1~3个整数。第一个整数如果是0,则表示输出双向链表中的所有元素;第一个整数如果是1,表示插入1个整数,其后跟2个整数i、e代表在第i个位置插入e;第一个整数如果是2,表示删除1个整数,其后跟1个整数i,表示删除的位置为i。
起始双向链表为空表。保证链表中每个元素不会重复,同时所有的操作都合法。
输出
当需要输出双向链表中的所有元素时输出,每次输出一行。整数间用一个空格隔开。
样例输入
1 1 2
0
1 2 7
0
2 1
0
1 2 4
1 3 5
1 2 6
0
2 3
0
样例输出
2
2 7
7
7 6 4 5
7 6 5
16号第3天改这道题 终于改对了 从这道题我发现自己之前写的都错了
#include<stdio.h>
#include<stdlib.h>
#define ERROR 0
#define OK 1
typedef int Status;
typedef int ElemType;
//-----线性表的双向链表存储结构-------
typedef struct Dulnode{
int data;
struct Dulnode *prior;
struct Dulnode *next;
}DuLNode,*DuLinkList;
DuLinkList GetElemP_DuL(DuLinkList l,int i)
{//找到双向循环链表的第i个位置
DuLinkList s ;
int j ;
s = l->next ;
for( j = 1; j < i&&s !=l; j++)
{
s = s->next ;
}
return s;
}
Status ListInsert_DuL(DuLinkList l,int i,ElemType e)
{//在带头结点的双链表L中的第i个位置之前插入元素e
//i的合法值为1<=i<= 表长+1;
DuLinkList s ,p;
if(!(p = GetElemP_DuL(l,i)))//在L中确定插入的位置指针p
return ERROR;
s= (DuLinkList)malloc(sizeof(DuLNode));
s->data = e;
p->prior->next = s;
s->prior = p->prior ;
s->next = p;
p->prior = s;
s = l->next ;
return OK;
}
Status ListDelete_DuL(DuLinkList l,int i)
{
//删除带头结点的双链循环链表L中的第i个元素
//i的合法值1<= i<= 表长
DuLinkList p;
if(!(p = GetElemP_DuL(l,i)))//在L中确定第i个元素的位置指针p
return ERROR;
p->prior->next = p->next ;
p->next->prior = p->prior;
free(p);
}
void print(DuLinkList l)
{
DuLinkList s = l->next ;
int i = 0;
while(s != l)
{
if(i)
printf(" ");
printf("%d",s->data );
s = s->next ;
i++;
}
printf("
");
return ;
}
int main()
{
int n,i,e;
DuLinkList l,s;
l = (DuLinkList)malloc(sizeof(DuLNode));
l->next = l ;
l->prior = l ;
while(scanf("%d",&n)!=EOF)
{
switch(n)
{
case 0:
print(l);
break;
case 1:
scanf("%d%d",&i,&e);
ListInsert_DuL(l,i,e);
break;
case 2:
scanf("%d",&i);
ListDelete_DuL(l,i);
break;
}
}
return 0;
}