《数据库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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值