双链表
上回说完单链表,在实践中我们发现,在遍历链表时,我们不仅需要通过下一个节点的地址来进行遍历,当遇到一些特殊情况(如 删除链表中的指定节点,对链表数据进行排序等等…….),单链表就显得有些力不从心,灵活度不够,效率低下了。
当我们给节点增加一个指向上一个节点的变量,便实现提高链表灵活度的目标了。
就像公路的双行道…
实现逻辑:
实现代码(字母实例):
#include<stdio.h>
#include<malloc.h>
typedef struct node
{
char data;
struct node *prior;
struct node *next;
}node;
node *create(int n)
{
node *p=NULL,*head=NULL,*rump=NULL;
head=malloc(sizeof(node));
p=head;
char a='A';
node *s;
int i=1;
if(n!=0)
{
while(i<=n)
{
s=malloc(sizeof(node));
s->data=a;
p->next=s;
s->prior=p;
p=s;
a++;
i++;
}
p->next=head->next;
head->next->prior=p;
free(head);
return p->next;
}
}
node *next(node *p,int n)
{
int s;
if(n<0)
{
for(s=0;s>n;s--)
{
p=p->next;
}
return p;
}
else
{
for(s=0;s<n;s++)
{
p=p->prior;
}
return p;
}
}
int main()
{
node *p=create(26);
int sa;
int s;
printf("输入一个整数(正数向右移,负数向左移。)\n");
while(1)
{
if(scanf("%d",&s)!=1&&(char)s=='s')
break;
else
{
p=next(p,s);
for(sa=0;sa<26;sa++)
{
printf("%c ",p->data);
p=p->next;
}
printf("\n");
}
}
}
运行结果:
Python版
# -*- coding: cp936 -*-
__metaclass__=type
class Node:
def __init__(self):
self.data=0
self.prior=self
self.next=self
def setdata(self,data):
self.data=data
def getdata(self):
print self.data
def nextnode(node,num):
for i in range(num-2*num):
node=node.next
for i in range(26):
print chr(node.data),
node=node.next
print ' '
return node
def priornode(node,num):
for i in range(num):
node=node.prior
for i in range(26):
print chr(node.data),
node=node.next
print ' '
return node
if __name__=='__main__':
p=Node()
head=Node()
p=head
for i in range(65,91):
s=Node()
s.data=i
p.next=s
s.prior=p
p=s
s.next=head.next
head.next.prior=s
head=head.next
for i in range(26):
print chr(head.data),
head=head.next
print ' '
head=head.next
t=True
head=head.prior
print head.data
while(t):
i=raw_input('请输入一个数字\n')
if i=='end':
t=False
elif int(i)>=0 :
head=priornode(head,int(i))
elif int (i)<0:
head=nextnode(head,int(i))
运行结果: