带头结点的链表的创建与操作

链表比数组的优势在于,它可提供高效的重排数据的能力,插入和删除操作比数组简单,因为在进行插入和删除过程中不需要移动收到影响的数据项之后的所有元素。

                        劣势在于:不能快速访问链表中的任意项。

 

list.c

#include<stdio.h>
#include<stdlib.h>
#include "list.h"
List MakeEmpty(List L)
{

	if(L !=NULL)
		DeleteList(L);
	L=malloc(sizeof(struct Node));
	if(NULL==L)
		printf("out of memeory!");
	L->Next=NULL;
	return L;
}

//
/* Return true if L is empty */
int IsEmpty(List L)
{
	return L->Next==NULL;
}


/* Return true if P is the last position in list L */
/* Parameter L is unused in this implementation */
int IsLast(Position P,List L)
{
	return P->Next==NULL;
}

/* Return Position of X in L; NULL if not found */
Position Find(ElementType X,List L)
{
	Position P;
	P=L->Next;
	while(P)
	{
		if(P->Element== X)
			break;
		P=P->Next;
	}
	return P;
}

void Delete(ElementType X,List L)
{
	Position P,TmpCell;
	P=FindPrevious(X,L);
	if(!IsLast(P,L))
	{
		TmpCell=P->Next;
		P->Next=TmpCell->Next;
		free(TmpCell);
	}
}

Position FindPrevious(ElementType X,List L)
{
	Position P;
	P=L;
	while(P->Next!=NULL && P->Next->Element!=X)
		P=P->Next;
	return P;
}

//将一个元素插入到由P所指示的位置之后
void Insert(ElementType X,List L,Position P)
{

	Position TmpCell;
	TmpCell=malloc(sizeof(struct Node));
	if(TmpCell==NULL)
		printf("out of memory");
	TmpCell->Element=X;
	TmpCell->Next=P->Next;
    P->Next=TmpCell;
}

void DeleteList(List L)
{
	Position P,Tmp;
	//L->Next=NULL;
	P=Advance(L);//p=L->Next;
	L->next=NULL;
	while(NULL!=P)
	{
      Tmp=P->Next;
	  free(P);
	  P=Tmp;	
	}
}
 
Position Header(List L)
{
	return L;//返回头结点指针
}

Position Frist(List L)
{
	return L->Next;//返回头结点之后的第一个实结点的指针
}

Position Advance(Position P)
{
   return P->Next;//返回指针p指向结点的下一个结点
}

ElementType Retrieve(Position P)
{
	return P->Element;
}


list.h

 

typedef int ElementType;

#ifndef _List_H
#define _List_H

struct Node;
typedef struct Node *PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position;

struct Node
{
	ElementType Element;
	Position Next;
};

List MakeEmpty(List L);
int IsEmpty(List L);
int IsLast(Position P,List L);
Position Find(ElementType X,List L);
void Delete(ElementType X,List L);
Position FindPrevious(ElementType X,List L);
void Insert(ElementType X,List L,Position P);
void DeleteList(List L);
Position Header(List L);
Position Frist(List L);
Position Advance(Position P);
ElementType Retrieve(Position P);

#endif


main.c

/*******************************************************************
 *author:jia                                                        *
 *purpose:带有头结点的链表的创建与相关操作                             *
 *Date:2014.3.10                                                   *
 *******************************************************************/
#include<stdio.h>
#include "list.h"
void PrintList(const List L)
{
	Position P = L->Next;
	if(IsEmpty(L))
		printf("Empty list!\n");
	while(P != NULL)
	{
		printf("%d ",P->Element);
		P=P->Next;
	}
    printf("\n");
}

int main(void)
{
	List L;
	Position P;
	int i;
    L=MakeEmpty(NULL);
	P=Header(L);
	PrintList(L);

	for(i=0;i<10;i++)
	{
		Insert(i,L,P);
		PrintList(L);
		P=Advance(P);
	}

	for(i=0;i<10;i+=2)
	{
		Delete(i,L);
	}
    
	if(NULL==Find(2,L))
	{
		printf("Find fails!\n");
	}
    
	printf("Finished deletions\n");

	PrintList(L);

	DeleteList(L);
    
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值