1. 程式人生 > >資料結構學習筆記-03-線性表及其實現

資料結構學習筆記-03-線性表及其實現

線性表的順序儲存實現

typedef struct LNode *list;
struct LNode
{
	ElementType Data[MAXSIZE];
	int Last;
};

struct LNode L;
List Ptrl;

初始化:

List MakeEmpty()
{
	List PtrL;
	PtrL = (List )malloc(sizeof(struct LNode));
	PtrL->Last = -1;
	return PtrL;
}

查詢指定元素:

int Find(ElementType X,List PtrL)
{ int i = 0; while(i<=PtrL->Last && PtrL->Data[i]!=X) i++; if (i>PtrL->Last) return -1; else return i; }

插入:

void insert(ElementType X,int i,List PtrL)
{
	int i;
	if(PtrL->Last == MAXSIZE-1)
	{
		printf("表滿");
		return;
	}
	if (i<1||i>PtrL->Last+2)
	{
		printf
("位置不合法"); return; } for (j=PtrL->Last;j>=i-1;j--) PtrL->Data[j+1]=PtrL->Data[j]; PtrL->Data[i-1]=X; PtrL->Last++; return; }

刪除節點:

void Delete(int i,List PtrL)
{
	int j;
	if (i<1||i>PtrL->Last+1)
	{
		printf("不存在第%d個元素",i);
		return;
	}
	for (j=i;j<=PtrL->
Last;j++) PtrL->Data[j-1] = PtrL->Data[j]; PtrL->Last--; return; }

線性表的鏈式儲存實現

typedef struct LNode *List;
struct LNode
{
	ElementType Data;
	List Next;
};
struct LNode L;
List PtrL;

求表長:

int Length(List PtrL)
{
	List p = PtrL;
	int j = 0;
	while(p)
	{
		p=p->Next;
		j++;
	}
	return j;
}

按序號查詢:

List FindKth(int K,List PtrL)
{
	List p = PtrL;
	int i = 1;
	while(p!=NULL&&i<K)
	{
		p = p->Next;
		i++;
	}
	if (i==K)
		return p;
	else return NULL;
}

按元素值查詢:

List Find(ElementType X,List PtrL)
{
	List p=PtrL; 
	while(p!=NULL && p->Data!=X)
		p=p->Next; 
	return p;
}

插入節點:

List Insert(List PtrL,int k,ElementType X)//插入元素
{
	List p,s;
	if (k==1)
	{
		s=(List)malloc(sizeof(struct LNode));
		s->Data=X;
		s->Next=PtrL;
		return s;
	}
	p=FindKth(k,PtrL)
	if (p==NULL)
	{
		printf("引數k出錯");
		return NULL;
	}
	else 
	{
		s=(List)malloc(sizeof(struct LNode));
		s->Data=X;
		s->Next=p->Next;
		p->Next=s;
		return PtrL;
	}
}

刪除節點:

List Delete(int k,LIst PtrL)//刪除節點
{
	List p,s;
	if (k==1)
	{
		s=PtrL;
		if (PtrL!=NULL)
			PtrL=PtrL->next;
		else 
			return NULL;
		free(s);
		return PtrL;
	}
	p=FindKth(k-1,List)
	if (p==NULL)
	{
		printf("第%d個節點不存在",k-1);
		return NULL;
	}
	if (p->Next==NULL)
	{
		printf("第%d個節點不存在",k);
		return NULL;
	}
	else
	{
		s=p->Next;
		p-Next=s->Next;
		free(s);
		return PtrL;
	}
}