《數據庫C語言版》雙向鏈表的表示和實現

創建一個工程

在Header files中 創建兩個文件

1.status.h

  #ifndef STATUS_H
#define STATUS_H
//函數結果狀態代碼
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR  0
#define INFEASIBLE -1
#define OVERFLOW -2
//Status是函數的類型,其值是函數結果狀態代碼
typedef int Status;

typedef int ElemType;
#endif

2.創建DulinkList.h

#ifndef DULLINKLIST_H
#define DULLINKLIST_H
#include "status.h"
typedef struct DuLNode{
    ElemType data;//數據域 
   struct DuLNode *next;
    struct DuLNode *prior;
   }DuLNode,*DuLinkList;
   DuLinkList CreateDuLinkList();//創建雙向鏈表 
  Status ListTraverse(DuLinkList L);//打印鏈表
 int IsEmptyDuLinkList(DuLinkList L); 
 int GetLengthDbLinkList(DuLinkList L);//計算鏈表長度  
 Status ListInsert_DuL(DuLinkList L,int i,ElemType e);//插入節點 
 Status ListDelet_DuL(DuLinkList L,int i);//刪除節點
 void FreeMemory(DuLinkList *L); 
 int LocateElem(DuLinkList L,ElemType e); 
 Status GetElem(DuLinkList L,int i,ElemType *e);
#endif

**

在source files中創建

**

1.duLinkList.c

   #include "DulinkList.h"
    #include <stdio.h>
    DuLinkList CreateDuLinkList(){//創建空的雙向鏈表 
    	DuLinkList L;
    	L=(DuLinkList)malloc(sizeof(DuLNode));
    	L->data=0;
    	L->prior=NULL;
    	L->next=NULL;
    	return L;
    
    } 
    //計算鏈表的長度
int GetLengthDbLinkList(DuLinkList L)
{
	int length = 0;
	DuLinkList pt =L->next;
 
	while (pt != NULL)
	{
		length++;
		pt = pt->next;
	}
	return length;
}
int IsEmptyDuLinkList(DuLinkList L){
DuLinkList pt=L->next;
if(pt==NULL)
return OK;
else
 return FALSE; 
} 
Status ListInsert_DuL(DuLinkList L,int i,ElemType e){//插入 
    DuLinkList pt,p_new;
    pt=NULL;
    p_new=NULL;
    if(i>0&&i<GetLengthDbLinkList(L)+2){
    	p_new=(DuLinkList)malloc(sizeof(DuLNode));
        if(NULL==p_new){
        	printf("內存分配失敗!\n");
        return ERROR;
        }
        
  while (1)
		{
		i--;
			if (0 == i)
				break;
			L = L->next;
		}
		
		pt = L->next;
		p_new->data = e;
		p_new->next = pt;
		if (NULL != pt)
			pt->prior= p_new;
		p_new->prior = L;
		L->next = p_new;
		
		return TRUE;
	}
	else
		return FALSE ;
}
Status ListDelet_DuL(DuLinkList L,int i){//刪除 

   DuLinkList pt=NULL;
  if (i > 0 && i < GetLengthDbLinkList(L) + 1)
	{
		while (1)
		{
			i--;
			if (0 == i)
				break;
			L = L->next;
		}
 
		pt = L->next->next;
		free(L->next);
    	L->next = pt;
		if (NULL != pt)
			pt->prior = L;
 
		return OK;
	}
	else
		return ERROR ;
}
Status ListTraverse(DuLinkList L){//遍歷輸出 
	 DuLinkList pt = NULL;
    pt = L->next;
    int k = 0;
    while (pt)
    {
        printf("%4d", pt->data);
        pt = pt->next;
        k++;
    }
    if (k == 0)
    {
        printf("鏈表爲空");
        return ERROR;
    }
    return OK;
}
void FreeMemory(DuLinkList *L){
	DuLinkList pt=NULL;
	while(*L!=NULL){
		pt=(*L)->next;
		free(*L);
		if(NULL!=pt)
		      pt->prior=NULL;
		      *L=pt;
	}
}
int LocateElem(DuLinkList L,ElemType e){
	DuLinkList p;
	p=L->next;
	int j=1;
	while(p&&(p->data)!=e){
		p=p->next;
		j++;
	} 
	if(p){
		return j;
	}else{
		return 0;
	} 
	
}
Status GetElem(DuLinkList L,int i,ElemType *e)
{
	//獲取第i個元素的內容
	DuLinkList p;
	p=L->next;
	int j=1;
	while(p!=L&&j<i)
	{
		p=p->next;
		j++;
	} 
	if(p==L||j>i) return 0;
	*e=p->data;
	return OK; 
}

2.main_duLinkLIst.c

#include "DulinkList.h"
#include <stdio.h>
void main(){
	DuLinkList L;
	ElemType e;
	int j,n;
	L=CreateDuLinkList();
	printf("鏈表是否爲空1爲空 0爲否:%d",IsEmptyDuLinkList(L));
	ListInsert_DuL(L,1,1);
	ListInsert_DuL(L,2,2);
	ListInsert_DuL(L,3,3);
	ListInsert_DuL(L,4,4);
	printf("\n鏈表是否爲空1爲空 0爲否:%d",IsEmptyDuLinkList(L));
	printf("\n雙向鏈表的長度爲:%d",GetLengthDbLinkList(L));
	printf("\n雙向鏈表的元素爲:");
	ListTraverse(L);
	ListDelet_DuL(L,3);
	printf("\n刪除後雙向鏈表的元素爲:");
	ListTraverse(L);
		printf("\n獲取元素在鏈表中的位置:%d",LocateElem(L,4));
		
      n=2;
      j=GetElem(L,n,&e);
      if(j)
      printf("\n鏈表的第%d個元素值爲%d\n",n,e);
	  else
	    printf("不存在第%d個元素\n",n);
	FreeMemory(&L);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章