第二章(5).双向循环链表

来源:互联网 发布:mac安装包损坏 编辑:程序博客网 时间:2024/05/20 22:40

#include<stdio.h>
#include<stdlib.h>

//和单链表类似,双向链表也可以有循环链表
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2

typedef int ElemType;

typedef struct DuLNode
{
 ElemType data;
 struct DuLNode *prior;
 struct DuLNode *next;
}DuLNode,*DuLinkList;

//在双向链表中,有些操作如ListLength,GetElem,LocateElem等仅需一个方向的指针,则他们的算法描述和线性链表相同

//但在插入和删除时有很大不同,操作是需要修改两个指针。
void InitDuLinkList(DuLinkList *L,int n)
{
 DuLinkList p,q;
 int i = n;

 *L = (DuLinkList)malloc(sizeof(DuLNode));
 (*L)->next = *L;
 (*L)->prior = *L;

 if(i == 1)
 {
  p = (DuLinkList)malloc(sizeof(DuLNode));
  scanf("%d",&p->data);
  (*L)->next = p;
  p->next = (*L);
  p->prior = (*L);
 }
 else
 {
  q = (*L);
  while(i > 0)
  {
   p = (DuLinkList)malloc(sizeof(DuLNode));
   scanf("%d",&p->data);
   q->next = p;    //q为p的前一个结点
   p->prior = q;
   q = p;   
   --i;
  }
  q->next = (*L);
  (*L)->prior = q;
 }
}

void PrintDuLinkList(DuLinkList L)
{
 DuLinkList p;
 p = L->next;
 
 if(!p)
 {
  exit(0);
 }
 while(p != L)
 {
  printf("%d ",p->data);
  p = p->next;
 }
 printf("\n");
}

void InsertLinkList(DuLinkList *L, int i, ElemType e)   //将元素插入到第i个元素之前
{
 DuLinkList p,q;
 int j = 1;
 p = (*L)->next;

 while( p != (*L) && j < i)
 {
  p = p->next;
  ++j;
 }
 if( p == (*L) || j > i)
 {
  exit(0);
 }
    //此时p为第i个元素结点
 
 if(!(q = (DuLinkList)malloc(sizeof(DuLNode))))
 {
  exit(0);
 }
 q->data = e;

 q->prior = p->prior;
 p->prior->next = q;   //先插入
 q->next = p;         //后连链接   
 p->prior = q;
}

ElemType  DeleteLinkList(DuLinkList *L, int i,ElemType *e)
{
 DuLinkList p;
 int j = 1;
 p = (*L)->next;

 while( p != (*L) && j < i)
 {
  p = p->next;
  ++j;
 }
 if( p == (*L) || j > i)
 {
  exit(0);
 }
 
 *e = p->data;
 p->prior->next = p->next;
 p->next->prior = p->prior;
 return *e;
}


void main(void)
{
 DuLinkList *L;
 ElemType *e;
 int n = 5;

 L = NULL;
 e = NULL;

 L = (DuLinkList *)malloc(sizeof(DuLinkList));
 e = (ElemType *)malloc(sizeof(ElemType));

 InitDuLinkList(L,n);
 PrintDuLinkList(*L);
 InsertLinkList(L,2,33);
 PrintDuLinkList(*L);
 printf("%d\n",DeleteLinkList(L,2,e));
 PrintDuLinkList(*L);
}

 
0 0