链表的学习(3)

双向链表:有一个前驱指针和后继指针---利用空间来换取时间的一种数据结构

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;

}

与双向链表另外一道有关的题目:

维吉尼亚密码---点击打开链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值