↓注意:下面有小马宝莉图片↓
↓以下是正文↓
------------------------------------------------------------------------------------------------------------------------------------------
双向链表的尾插法同单链表的尾插法一样,通过将新结点逐个插入链表的尾部来创建链表,将链表尾部的结点的指针域指向后缀,不同的是新结点不仅需要将链表尾部结点的后缀指针域指向新结点,还需要将新结点的前缀指向链表尾部结点
单链表的头插法访问网址:
程序运行结果如下:
1 1
2 2
3 1
4 31
5 4
6 23
7 3
8 55
9 543
0 354
122 366
122 366
0 354
9 543
8 55
7 3
6 23
5 4
4 31
3 1
2 2
1 1
请按任意键继续. . .
代码如下:
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int a0;
int b0;
}Elemtype;
struct Test
{
Elemtype data;
struct Test *prior;//*前缀
struct Test *next;//*后缀
};
struct Test *Math_Dash()
{
int a[]={1,2,3,4,5,6,7,8,9,0,122},b[]={1,2,1,31,4,23,3,55,543,354,366};//*要插入的信息
struct Test *c,*d;//*创建新结点
c=(struct Test*)malloc(sizeof(struct Test));//*为新结点分配内存
c->next=NULL;c->prior=NULL;//*将头结点的前缀指针域和后缀指针域置空
d=c;
int e;
for(e=1;e<=11;e++)//*双向链表尾插法
{
struct Test *f;//*创建新结点
f=(struct Test*)malloc(sizeof(struct Test));//*为新结点分配内存
f->data.a0=a[e-1];f->data.b0=b[e-1];//*赋值
f->next=NULL;//*将f的后缀指针域置空
f->prior=d;//*f的前缀指向d
d->next=f;//*将d的后缀指向f
d=d->next;//*指向下一个结点
}
c=c->next;c->prior=NULL;//*通过元素前移,再将c的前缀置空,从而删除头结点
//*这样,就可以避免输出莫名其妙的数字了
return c;
}
int main(int argc, char *argv[])
{
struct Test *o;
o=Math_Dash();
while(o)
{
printf("%d\t%d\n",o->data.a0,o->data.b0);
o=o->next;
}
o=Math_Dash();
while(o->next)
{
o=o->next;
}
while(o)
{
printf("%d\t%d\n",o->data.a0,o->data.b0);
o=o->prior;
}
system("pause");
return 0;
}