在双向链表中,每个结点有两个链接,一个链接到下一个结点,一个链接到上一个结点
struct node{
int data;
struct node* next;
struct node *prev;
};
双向链表的优点是什么?
如果我们用有指向任何一个结点的指针,我们可以正向查询也可以反向查询。仅用一个指针,我们就可以访问这个结点,这个结点的上一个结点,这个结点的下一个结点。
ps:为了避免写重复的代码,先写一个创建新结点的函数get_new_node:
struct node* get_new_node(int x)
{
sn* temp=(sn*)malloc(sizeof(sn*));
temp->data=x;
temp->prev=NULL;
temp->next=NULL;
retur temp;
}
1.插入一个结点到链表头部:
struct node * insert_in_head(struct node* head,int x)
{
struct node *temp=get_new_node(x);
if(head==NULL)//链表为空的情况
{
head=temp;
return ;
}
head->prev=temp;//新结点链接到头结点前一个
temp->next=head;//新结点的后一个链接头结点
head=temp;//重置头结点
return head;
}
2.插入一个结点到链表尾部:
void insert_in_tail(struct node* head,int x)
{
struct node* temp=get_new_node(x);
struct node *p=head;//为了不改变头结点
while(p->next!=NULL)
{
p=p->next;
}//先遍历使p指向链表末尾
p->next=temp;//插入
temp->prev=p;
}
3.打印链表(这个跟单向链表没区别):
void print(struct node* head)
{
struct node* p=head;
printf("the list is:");
while(p!=NULL)
{
printf("%d ",p->data );
p=p->next;
}
printf("\n");
}
4.反向打印链表:
void reverse_print(struct node* head)
{
struct node* q=head;
while(q->next!=NULL)
{
q=q->next;
}//遍历
printf("reverse:");
while(q!=NULL)
{
printf("%d",q->data );
q=q->prev;//倒退到前一个结点
}
printf("\n");
}
写成一个完整的:
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int data;
struct node* next;
struct node *prev;
}sn;
sn* head;
sn* get_new_node(int x)
{
sn* temp=(sn*)malloc(sizeof(sn*));
temp->data=x;
temp->prev=NULL;
temp->next=NULL;
return temp;
}
void insert_in_head(int x)
{
sn *temp=get_new_node(x);
if(head==NULL)
{
head=temp;
return ;
}
head->prev=temp;
temp->next=head;
head=temp;
}
void insert_in_tail(int x)
{
sn* temp=get_new_node(x);
sn*p=head;
while(p->next!=NULL)
{
p=p->next;
}
p->next=temp;
temp->prev=p;
}
void print()
{
sn* p=head;
printf("the list is:");
while(p!=NULL)
{
printf("%d ",p->data );
p=p->next;
}
printf("\n");
}
void reverse_print()
{
sn* q=head;
while(q->next!=NULL)
{
q=q->next;
}
printf("reverse:");
while(q!=NULL)
{
printf("%d",q->data );
q=q->prev;
}
printf("\n");
}
int main()
{
head=NULL;
insert_in_head(2);print();reverse_print();
insert_in_head(4);print();reverse_print();
insert_in_tail(6);print();reverse_print();
insert_in_tail(8);print();reverse_print();
}
瞅一眼结果: