单链表是每一个节点(结构体)通过各自的指针,不断地指向下一个节点从而将它们串成链.而双向链表在保持这一特征之外,最大的区别就是,每一个节点还指向了它的上一个节点,即每个节点的指针域多了一个指向前驱的指针,从而形成了一个反向的链,所以将这种链表称作双向链表.
不难看出,其实双向链表由单链表衍生出来,并没有增加很多复杂度,只要能够理解单链表的一些基本操作,双向链表也就很容易掌握拉-<.
下面我贴出代码.
#include<stdio.h>
#include<stdlib.h>
#define elementype int
typedef struct dulnode {
elementype data;
struct dulnode* next;
struct dulnode* prior;
}dulnode;
typedef struct dulnode* list;
void outlist(list);//输出链表的元素
void addelem(list);//在链表第k个位置插入元素
void deltelem(list);//删除链表的第K个位置
int getlength(list);//得到链表的长度
elementype getelem(list); //得到链表第k个元素的值
list getadress(list);//得到链表第k个元素的地址
int main()
{
list l;
l = (list)malloc(sizeof(dulnode));
l->next = NULL;
list head = l;
for (int i = 1; i <= 10; ++i)
{
list temp;
temp = (list)malloc(sizeof(dulnode));
temp->data = i;
if (head->next)
{
head->prior = temp;
temp->next = head;
l->next = temp;
temp->prior = l;
head = head->next;
}
temp->next = head->next;
temp->prior = head;
head->next = temp;
head = head->next;
}
outlist(l);
addelem(l);
printf("当前链表的长度为:%d\n",getlength(l));
printf("%d\n",getelem(l));
outlist(l);
deltelem(l);
outlist(l);
list t;
t=getadress(l);
printf("%d",t->data);
return 0;
}
void outlist(list t)
{
int i = 1;
while (t&&t->next)
{
t = t->next;
printf("链表第%d个元素的值为:%d\n", i++,t->data);
}
}
void addelem(list t) {
int num,k;
printf("请输入要插入的值:\n");
scanf("%d", &num);
printf("请输入要插入的位置:\n");
scanf("%d",&k);
if(k<0||k>10)
{
printf("输入非法");
exit(0) ;
}
list head = t;
for (int i = 1; i <= k - 1; ++i)
head = head->next;
list q;
q = (list)malloc(sizeof(dulnode));
q->data = num;
q->next = head->next;
head->next->prior = q;
head->next = q;
q->prior = head;
}
void deltelem(list t)
{
int k;
printf("请输入要删除的位置:\n");
scanf("%d",&k);
if(k>10||k<1)
{
printf("输入非法\n");
exit(0);
}
list head = t;
for (int i = 1; i <= k-1; ++i)
head = head->next;
list q = head->next;
q->next->prior = head;
head->next = q->next;
}
int getlength(list t)
{
int i=0;
t=t->next;
while (t)
{
t=t->next;
i++;
}
return i;
}
elementype getelem(list t)
{
int k=0,length=0;
length=getlength(t);
printf("请输入要要查找元素的位置:\n");
scanf("%d",&k);
if(k<0||k>length)
{
printf("输入非法\n");
exit(0);
}
int i=1;
t=t->next;
while(t&&i<k){
t=t->next;
i++;
}
return t->data;
}
list getadress(list t){
int k,length,i=1;
length=getlength(t);
printf("请输入待查找元素地址的序号:\n");
scanf("%d",&k);
if(k<0||k>length)
{
printf("输入非法\n");
exit(0);
}
t=t->next;
while(t&&i<k)
{
t=t->next;
i++;
}
return t;
}