typedef struct doublylink {
int data;
struct doublylink* prior;//前驱
struct doublylink* next;//后继
}linkco, * dlinklist;
1.初始化头节点
这里解释一下为什么要用dlinklist& l。因为头节点在创建新的空间是,它的地址会发生改变,所以要是不加地址符,将无法传递新的地址回去,导致这个l只在函数中创建了空间,而在主函数中却没有开辟空间。这里虽然dinklink是结构体指针,但还是和形参与实参的性质是一样的。
int inlist(dlinklist& l)//初始化双向循环链表
{
l = (dlinklist)malloc(sizeof(linkco));
if (!l)
return 0;
l->prior = l;/*这里是构建循环的头节点*/
l->next = l;
return 1;
}
2.销毁链表
void destorydlink(dlinklist& l)//销毁循环双向链表
{
dlinklist p = l->next;
while (p != l)
{
p = l->next;
free(l);
l = p;
}
}
3.尾插法给链表赋值
void creatdlinktatil(dlinklist l)//尾插法
{
int x;
dlinklist p = l;
while (1)
{
scanf_s("%d", &x);
dlinklist q;
q = (dlinklist)malloc(sizeof(linkco));
q->data = x;
q->prior = p;
p->next = q;
p = q;
if (getchar() == '\n')
break;
}
p->next = l;
l->prior = p;
}
4.查找值
int finddlink(dlinklist l,int x)//查找值
{
int i = 0;
dlinklist p = l->next;
while (p != l)
{
i++;
if (p->data == x)
return i;
p = p->next;
}
return 0;
}
5.插入
void insertdlinkcode(dlinklist l, int x, int i)//x为插入的值,i为插入的位置
{
dlinklist p = l;
int j = 0;
while (p->next != l && j < i - 1)
{
j++;
p = p->next;
}
if (p->next == l || j > i)
{
printf("flase");
exit(0);
}
dlinklist q;
q = (dlinklist)malloc(sizeof(linkco));
q->data = x;
q->next = p->next;
p->next->prior = q;
q->prior = p;
p->next = q;
}
6.删除
void deletedlinkcode(dlinklist l, int i)//删除i结点的值
{
int j = 0;
dlinklist p = l;
while (p->next != l && j < i - 1)
{
j++;
p = p->next;
}
if (p->next == l && j > i)
{
printf("false");
exit(0);
}
p->next = p->next->next;
free(p->next->prior);
p->next->prior = p;
}
8.遍历
void traversedlink(dlinklist l)//遍历链表
{
dlinklist p = l->next;
while (p != l)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}