循环链表的基本操作:
#include<stdio.h>
#include<stdlib.h>
typedef char ListData;
typedef struct dnode {
ListData data;
struct dnode * prior, * next;
} DblNode;
typedef DblNode * DblList;
void CreateDblList ( DblList & first ) {
printf("请输入字符:") ;
first = ( DblNode * ) malloc ( sizeof ( DblNode ) );
if ( first == NULL )
{ printf ( "存储分配错!\n" ); exit (1); }
first->prior = first->next = first;
//表头结点的链指针指向自己
ListData data;
DblNode *q;
while(scanf("%c",&data)){
q = ( DblNode * ) malloc ( sizeof ( DblNode ) );
q->data=data;
q->prior = first->prior;
q->next = first;
first->prior->next=q;
first->prior=q;
if(getchar()=='\n') break;
}
}
DblNode *Locate (DblList first, int i){//查找
DblNode * p = first->next;
int count = 0;
if(i==0) return first;
while ( p != first )
{
if(count+1==i) return p;
count++;
p = p->next;
}
printf("error");
return p;
}
int Insertforth ( DblList first, int i, ListData x ) {
DblNode * p = Locate ( first, i-1 );
//指针定位于插入位置前驱
if ( p == first && i != 1) return 0;
DblNode * q = ( DblNode * ) malloc
( sizeof ( DblNode ) ); //分配结点
q->data = x;
q->prior = p; p->next->prior = q;
//在前驱方向链入新结点
q->next = p->next; p->next = q;
//在后继方向链入新结点
return 1;
}
int Insertback ( DblList first, int i, ListData x ) {
DblNode * p = Locate ( first, i );
//指针定位于插入位置后继
if ( p == first && i != 0) return 0;
DblNode * q = ( DblNode * ) malloc
( sizeof ( DblNode ) ); //分配结点
q->data = x;
q->prior = p->prior; p->prior->next = q;
//在前驱方向链入新结点
q->next = p; p->prior = q;
//在后继方向链入新结点
return 1;
}/**/
int Length ( DblList first ) {
//计算带表头结点的双向循环链表的长度
DblNode * p = first->next;
int count = 0;
while ( p != first )
{
printf("%c ",(p->data));
p = p->next;
count++;
}
return count;
}
int Removeforth ( DblList first, int i ) {
DblNode * q = Locate ( first, i );
DblNode * p = Locate ( first, i-1 );
//指针定位于删除结点位置前
p->next = p->next->next;
p->next->prior = p;
//删除结点
free ( q ); //释放
return 1;
}
int Removeback ( DblList first, int i ) {
DblNode * q = Locate ( first, i );
DblNode * p = Locate ( first, i+1 );
//指针定位于删除结点后继
if ( p == first ) return 0;
p->prior = p->prior->prior;
p->prior->next = p;
//删除结点
free ( q ); //释放
return 1;
}/**/
int Remove ( DblList first, int i ) {
DblNode * p = Locate ( first, i );
//指针定位于删除结点位置
if ( p == first ) return 0;
p->next->prior = p->prior;
p->prior->next = p->next;
//删除结点 p
free ( p ); //释放
return 1;
}
int main(){
DblList first;
int length;
CreateDblList(first);//创建
length=Length(first);
printf("%d ",length);
puts("");
printf("%d ",Insertforth(first,2,'b'));//工作指针在插入位前驱
length=Length(first);
puts("");
printf("%d ",Insertback(first,2,'e'));//工作指针在插入位后继
length=Length(first);
puts("");
printf("%d ",Remove(first,1));//删除1号位
length=Length(first);
puts("");
printf("%d ",Removeforth(first,1));//工作指针在插入位前驱
length=Length(first);
puts("");
printf("%d ",Removeback(first,1));//工作指针在插入位后继
length=Length(first);
return 0;
}
#include<stdio.h>
#include<stdlib.h>
typedef char ListData;
typedef struct dnode {
ListData data;
struct dnode * prior, * next;
} DblNode;
typedef DblNode * DblList;
void CreateDblList ( DblList & first ) {
printf("请输入字符:(5个左右,中间用一个空格隔开)") ;
first = ( DblNode * ) malloc ( sizeof ( DblNode ) );
if ( first == NULL )
{ printf ( "存储分配错!\n" ); exit (1); }
first->prior = first->next = first;
//表头结点的链指针指向自己
ListData data;
DblNode *q;
while(scanf("%c",&data)){
q = ( DblNode * ) malloc ( sizeof ( DblNode ) );
q->data=data;
q->prior = first->prior;
q->next = first;
first->prior->next=q;
first->prior=q;
if(getchar()=='\n') break;
}
}
DblNode *Locate (DblList first, int i){//查找
DblNode * p = first->next;
int count = 0;
if(i==0) return first;
while ( p != first )
{
if(count+1==i) return p;
count++;
p = p->next;
}
printf("error");
return p;
}
int Length ( DblList first ) {
//计算带表头结点的双向循环链表的长度
DblNode * p = first->next;
int count = 0;
while ( p != first )
{
printf("%c ",(p->data));
p = p->next;
count++;
}
return count;
}
int main(){
DblList first;
int length,n;
CreateDblList(first);//创建
length=Length(first);
printf("%d ",length);
puts("");
printf("请输入一个数字n,我们将输出第n位的前驱和后继,注意n的大小:\n");
scanf("%d",&n);
if(n<2||n>length) {printf("错误"); return 0;}
printf("%c %c",Locate(first,n)->prior->data,Locate(first,n)->next->data);
puts("");
return 0;
}