双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。
#include<iostream>
#include<stdio.h>
#include<malloc.h>
using namespace std;
typedef struct dnode
{
int data;
struct dnode *pre;
struct dnode *next;
}dnode;
void createNode(dnode *head);
void delNode(dnode *head,int pos);
void insertNode(dnode *head,int pos);
void printNode(dnode *head);
int
main(void)
{
dnode *head;
head = (dnode*)malloc(sizeof(dnode));
head->next = NULL;
head->pre = NULL;
createNode(head);
printNode(head);
delNode(head,3);
printNode(head);
insertNode(head,2);
printNode(head);
return 0;
}
void createNode(dnode *head)
{
dnode *p,*q;
q = head;
int tmp;
while(~scanf("%d",&tmp) && tmp!=-1)
{
p = (dnode *)malloc(sizeof(dnode));
p->data = tmp;
q->next = p;
p->pre = q;
p->next = NULL;
q = q->next;
}
}
void delNode(dnode *head,int pos)
{
//删除pos后
int i=0;
dnode *p,*q;
p = head->next;
while(p)
{
if(i==pos)
{
q = p->next;
q->next->pre = p;
p->next = q->next;
free(q);
return;
}
p = p->next;
i++;
}
}
void insertNode(dnode *head,int pos)
{
dnode *p;
p = head->next;
int i=0;
while(p)
{
if(i==pos)
{
dnode *tmp;
tmp = (dnode*)malloc(sizeof(dnode));
scanf("%d",&tmp->data);
tmp->next = p->next;
p->next->pre = tmp;
tmp->pre = p;
p->next = tmp;
break;
}
i++;
p = p->next;
}
}
void printNode(dnode *head)
{
dnode *p;
p = head->next;
while(p)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}