学習ノート------データ構造(C言語版)二重ループチェーンテーブル


//Function realization.cpp
#include"predefined.h"
#include"DoubleLinkList.h"
Status ListInsert_DuL(DuLinkList *L,int i,ElemType e)
//  2.18:             L  i         e,
//i     1<=i<=  +1。
{
	DuLinkList p,s;
	if(!(p=GetElemP_DuL(*L,i))) return ERROR;
	if(!(s=(DuLinkList)malloc(sizeof(DuLNode)))) return ERROR;
	(*s).data=e;
	(*s).prior=(*p).prior;
	(*(*p).prior).next=s;
	(*s).next=p;
	(*p).prior=s;
	return OK;
}

Status ListDelete_DuL(DuLinkList *L,int i,ElemType *e)
//  2.19:            L  i   ,i     1<=i<=  。
{
	DuLinkList p;
	if(!(p=GetElemP_DuL(*L,i))) return ERROR;
	*e=(*p).data;
	(*(*p).prior).next=(*p).next;
	(*(*p).next).prior=(*p).prior;
	free(p);
	return OK;
}

Status InitList_DuL(DuLinkList *L)//             
{
	(*L)=(DuLinkList)malloc(sizeof(DuLNode));
	if(!(*L)) exit(OVERFLOW);
	(**L).next=(**L).prior=*L;
	return OK;
}

Status DestroyList_DuL(DuLinkList *L)//     
{
	DuLinkList p,q;  
    p=*L;  
   do
    {  
        q=(*p).next;  
        free(p);  
        p=q;  
    }  
	while(p!=*L);
	(*L)=NULL;
    return OK; 
}

Status ClearList_DuL(DuLinkList *L)//     
{
	DuLinkList p,q;  
    p=*L;  
    if(!p) return FALSE;   
    p=(*p).next;  
    while(p!=*L)  
    {  
        q=p;  
        p=(*p).next;  
        free(q);  
    }  
	(**L).next=(**L).prior=*L;  
    return OK;  
}

Status ListEmpty_DuL(DuLinkList L)//      ,  TRUE。
{
	if(L&&(*L).next==L&&(*L).prior==L) return TRUE;
	else return FALSE;
}

Status ListLength_DuL(DuLinkList L)//    L   。
{
	ElemType n=0;  
    DuLinkList p;
	if(L)
	{
		p=(*L).next; 
        while(p!=L) 
		{
			n++;
		    p=(*p).next;
	    }
	}
    return n;
}

Status GetElem_DuL(DuLinkList L,int i,ElemType *e)// e  L  i     
{
	DuLinkList p;  
	int j=1;
	p=(*L).next;
	if(L)
	{
		while(p!=L&&ji) return ERROR;  
       *e=(*p).data;  
       return OK;
	}
	else return ERROR;
}

Status LocateElem_DuL(DuLinkList L,ElemType e,Status (*compare)(DuLinkList L,ElemType e))
//     L     e    compare     
{
	DuLinkList p;  
    p=L;  
    Status n;  
    n=compare(p,e);  
    if(n) return n;  
    else return FALSE; 
}

Status PriorElem_DuL(DuLinkList L,ElemType cur_e,ElemType *e)//    
{
	DuLinkList p;
	p=(*L).next;
	if(L)
	{
		while(p!=L)
		{
			if((*p).data==cur_e)
			{
				if((*p).prior==L) return ERROR;
				else
				{
					*e=(*(*p).prior).data;
					return OK;
				}

			}
			p=(*p).next;
		}
	}
	return ERROR;
}

Status NextElem_DuL(DuLinkList L,ElemType cur_e,ElemType *e)//    
{
	DuLinkList p;
	p=(*L).next;
	if(L)
	{
		while(p!=L)
		{
			if((*p).data==cur_e)
			{
				if((*p).next==L) return ERROR;
				else 
				{
					*e=(*(*p).next).data;
					return OK;
				}
			}
			p=(*p).next;
		}
	}
	return ERROR;
}

DuLinkList GetElemP_DuL(DuLinkList L,int i)
//     L   i      。
{
	DuLinkList p;
	int j;
	if(i>ListLength_DuL(L)+1||i<1) return NULL;
	p=(*L).next;
	for(j=1;j

//main.cpp
#include"predefined.h"
#include"DoubleLinkList.h"
Status equal(DuLinkList L,ElemType e)  
{  
    int i;
	DuLinkList p;
	p=(*L).next;
    for(i=1;p!=L;i++)
    {  
		if((*p).data==e)  return i;  
        p=(*p).next;
    }
	return FALSE;
}
Status visit(DuLinkList L)  
{  
    printf("%d ",(*L).data);  
    return OK;  
} 
int main()
{
	DuLinkList La;
	Status s;
	int n,i,m;
	ElemType e;
	printf("Function 1
★ InitList_DuL(DuLinkList *L) ...
"); s=InitList_DuL(&La); printf("▲ La: %d (0: 1: )

",s); printf("Function 2
★ ListEmpty_DuL(DuLinkList L) ...
"); s=ListEmpty_DuL(La); printf("▲ La : %d (0: 1: )

",s); printf("Function 3
★ ListInsert_DuL(DuLinkList *L,int i,ElemType e) ...
"); printf("▲ La :"); scanf("%d",&n); for(i=1;i<=n;i++) { printf("▲ La %d :",i); scanf("%d",&m); s=ListInsert_DuL(&La,i,m); printf("▲ ?:%d (1: 0: )
",s); } printf("
"); printf("Function 4
★ ListTraverse_DuL(DuLinkList L,Status (*visit)(DuLinkList L)) ...
"); printf("▲La :La={"); ListTraverse_DuL(La,visit); printf("}

"); printf("Function 5
★ ListLength_DuL(DuLinkList L) ...
"); s=ListLength_DuL(La); printf("▲La :%d

",s); printf("Function 6
★ ListDelete_DuL(DuLinkList *L,int i,ElemType *e) ...
"); ListDelete_DuL(&La,3,&e); printf("▲ La 3 :\"%d\"
",e); printf("▲La :La={"); ListTraverse_DuL(La,visit); printf("}

"); printf("Function 7
★ GetElem_DuL(DuLinkList L,int i,ElemType *e) ...
"); GetElem_DuL(La,3,&e); printf("▲La \"%d\"

",e); printf("Function 8
★ LocateElem_DuL(DuLinkList L,ElemType e,Status (*compare)(DuLinkList L,ElemType e)) ...
"); s=LocateElem_DuL(La,5,equal); printf("▲La \"5\" %d

",s); printf("Function 9
★ PriorElem_DuL(DuLinkList L,ElemType cur_e,ElemType *e) ...
"); PriorElem_DuL(La,5,&e); printf("▲La \"5\" %d

",e); printf("Function 10
★ NextElem_DuL(DuLinkList L,ElemType cur_e,ElemType *e) ...
"); NextElem_DuL(La,5,&e); printf("▲La \"5\" %d

",e); printf("Function 11
★ ClearList_DuL(DuLinkList *L) ...
"); printf("▲La :"); ListEmpty_DuL(La)?printf(" La !!!
"):printf(" La !!!
"); ClearList_DuL(&La); printf("▲La :"); ListEmpty_DuL(La)?printf(" La !!!
"):printf(" La !!!
"); printf("Function 12
★ DestroyList_DuL(DuLinkList *L) ...
"); printf("▲La :"); La?printf(" La !!!
"):printf(" La !!!
"); DestroyList_DuL(&La); printf("▲La :"); La?printf(" La !!!
"):printf(" La !!!
"); }

//DoubleLinkList.h
typedef struct DuLNode
{
	ElemType data;
	struct DuLNode *prior;
	struct DuLNode *next;
}DuLNode,*DuLinkList;
Status ListInsert_DuL(DuLinkList *L,int i,ElemType e);
Status ListDelete_DuL(DuLinkList *L,int i,ElemType *e);
Status InitList_DuL(DuLinkList *L);
Status DestroyList_DuL(DuLinkList *L);
Status ClearList_DuL(DuLinkList *L);
Status ListEmpty_DuL(DuLinkList L);
Status ListLength_DuL(DuLinkList L);
Status GetElem_DuL(DuLinkList L,int i,ElemType *e);
Status LocateElem_DuL(DuLinkList L,ElemType e,Status (*compare)(DuLinkList L,ElemType e));
Status PriorElem_DuL(DuLinkList L,ElemType cur_e,ElemType *e);
Status NextElem_DuL(DuLinkList L,ElemType cur_e,ElemType *e);
DuLinkList GetElemP_DuL(DuLinkList L,int i);
Status ListTraverse_DuL(DuLinkList L,Status (*visit)(DuLinkList L));

Status equal(DuLinkList L,ElemType e);
Status visit(DuLinkList L);

//predefined.h
#include "stdio.h"
#include "stdlib.h"
#define   TRUE           1
#define   FALSE          0
#define   OK             1
#define   ERROR          0
#define   INFEASIBLE    -1
#define   OVERFLOW      -2
typedef   int Status;
typedef   int ElemType;

注意:二重ループチェーンテーブルの挿入と削除操作と単一チェーンテーブルの違い!