双向链表:有一个前驱指针和后继指针---利用空间来换取时间的一种数据结构
typedef struct two
{
int a;
struct two *next;
struct two *prior;
}NODE;
双向链表的创建-头插法:
NODE *head,*s;
head=(NODE *)malloc(sizeof(NODE));
head->next=head->prior=NULL;
for(i=0;i<20;i++)
{
s=(NODE *)malloc(sizeof(NODE));
s->a=i;
s->next=head-next;
if(head->next!=NULL) head->next->prior=s;
head->next=s;
s->prior=head;
}
双向链表的创建-尾插法:
NODE *s,*head,*p;
head=(NODE *)malloc(sizeof(NODE));
head->next=head->prior=NULL;
p=head;//尾插法中一定要用一个间接指针,否则会找不到头结点
for(i=0;i<n;i++)
{
s=(NODE *)malloc(sizeof(NODE));
s->a=i;
s->next=NULL;
p->next=s;
s->prior=p;
p=s;
}
//如果想要循环双链表,在这里可以加上,p->next=head;head->prior=p;
双向链表的插入操作:顺顺序很重要
s->next=p;
s->prior=p->prior;
p->prior->next=s;
p->prior=s;
双向链表的删除操作(两步即可)
p->prior->next=p->next;
p->next->prior=p->prior;free(p);
附加一道简单的循环双链表的题:
问题描述
要求实现用户输入一个数使得26个字母的排列发生变化,例如用户输入3,使得结果为:DEFHIJKLMNOPQRSTUVWXYZABC,
同时需要支持负数,使得输入-3时,结果为:XYZABCDEFGHIJKLMNOPQRSTUVW。实现位置的前后都能移动且数据都是连着的,当然数据结构选择双向循环链表啦。
问题拓展
问题实际上是有关凯撒密码,凯撒密码的思想是通过把字母移动一定的位数来实现加密和解密。
明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。
#include <stdio.h>
#include <stdlib.h>
typedef struct two
{
char a;
struct two *next;
struct two *prior;
}NODE;
int main()
{
NODE *head,*s,*p,*q;
int i,N;
head=(NODE *)malloc(sizeof(NODE));
head->next=head->prior=NULL;
p=head;
for(i=0;i<26;i++)
{
s=(NODE *)malloc(sizeof(NODE));
s->a='A'+i;
s->next=NULL;
p->next=s;
s->prior=p;
p=s;
}
p->next=head->next;
head->next->prior=p;
q=head->next;
scanf("%d",&N);
while(N>0)
{
q=q->next;
N--;
}
while(N<0)
{
q=q->prior;
N++;
}
while(N=0)
{
}
for(i=0;i<26;i++)
{
printf("%c ",q->a);
q=q->next;
}
return 0;
}
与双向链表另外一道有关的题目:
维吉尼亚密码---点击打开链接