1. 程式人生 > >實現單鏈表各種基本運算的演算法

實現單鏈表各種基本運算的演算法

編寫一個頭檔案LinkList.h,實現單鏈表的各種基本運算,並在此基礎上設計一個主程式(exp2_2.cpp)完成如下功能:

  1. 初始化單鏈表h
  2. 依次採用尾插法插入a,b,c,d,e元素
  3. 輸出單鏈表h
  4. 輸出單鏈表h的長度
  5. 判斷單鏈表h是否為空
  6. 輸出單鏈表h的第3個元素
  7. 輸出元素a的位置
  8. 在第4個元素位置上插入f元素
  9. 輸出單鏈表h
  10. 刪除h的第3個元素
  11. 輸出單鏈表h
  12. 釋放單鏈表h

標頭檔案:

/*檔名:LinkList.h*/
# include<stdio.h>
# include<malloc.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 char ElemType;


//定義單鏈表的儲存結構
typedef struct LNode
{
	ElemType date;
	struct LNode *next; 
}LNode , *LinkList;


//構造一個單鏈表
Status InitList(LinkList &L)
{
	L=(LinkList)malloc(sizeof(LNode));//生成結點
	if(!L)
	{
		return OVERFLOW;
	}
	L->next = NULL;
	return OK;
}


//銷燬單鏈表
Status DestroyList(LinkList &L)
{
	LinkList q = L;
	while(q != NULL)
	{
		LinkList p = q;
		q = q->next;
		free(p);
		p = NULL;
	}
	return OK;
}



//判斷是否為空,為空返回ture,否則返回false
Status ListEmpty(LinkList L)
{
	if(!L->next)//為空
	{
		return TRUE;
	}
	else
		return FALSE;
}


//返回單鏈表的長度
Status ListLength(LinkList L)
{
	int i = 0;
	LNode * p;
	p = L->next;
	while(p != NULL)
	{
		i++;
		p = p->next;
	}
	return i;
}


//列印單鏈表中的元素
void DispList(LinkList &L)
{
  LinkList p;
  p = L->next;
  while(p != NULL)
  {
	  printf("%c" , p->date);
	  p = p->next;
  }
  printf("\n");
}


//從單鏈表L中查詢第i個元素,由引數e返回其元素的值
Status GetElem(LinkList L , int i , ElemType &e)
{
	int j = 1; 
	struct LNode *p = L->next;
	while(p && j<i)
	{
		p = p->next;
		++j;
	}
	if(!p || j>i) //第i個元素不存在
	{
	  return ERROR;
	}
	e = p->date;  //取第i個元素
	return OK;
}



//在單鏈表L中查詢元素e的位置,不存在則返回0
Status LocateElem(LinkList L, ElemType e)
{
	int i = 0;
	LinkList p = L->next;
	while (p)
	{
		i++;
		if (p->date == e)
		{
			return i;
		}
		p = p->next;
	}
	return 0;

}



//在單鏈表L中第i個位置之前插入元素e
Status ListInsert(LinkList &L, int i, ElemType e)
{
	int j = 0;
	LinkList p = L, s;
	while (p && j<i-1)
	{ 
		p = p->next;
		++j;
	}
	if (!p || j>i-1)
	{
		return ERROR;
	}
	s = (LinkList)malloc(sizeof(LNode));//生成新節點
	s->date = e;
	s->next = p->next; //把所有元素向後移一位
	p->next = s;
	return OK;
}



//單鏈表L中刪除第i個元素,並由e返回其值
Status ListDelete(LinkList &L, int i, ElemType &e)
{
	int j = 0;
	LinkList p = L, q;
	while (p->next && j<i-1)
	{
		p = p->next;
		++j;
	}
	if (!(p->next) || j>i-1)
	{
		return ERROR;
	}
	q = p->next;
	p->next = q->next;
	e = q->date;
	free(q);
		return OK;
}

主函式:

#include "LinkList.h"  
int main()  
{  
    int l;  
    LinkList(L);  
    ElemType e;  
    printf("初始單鏈表L\n");  
    InitList(L);  
    printf("依次採用尾插法插入a , b , c , d , e元素\n");  
    ListInsert(L , 1 , 'a');  
    ListInsert(L , 2 , 'b');  
    ListInsert(L , 3 , 'c');  
    ListInsert(L , 4 , 'd');  
    ListInsert(L , 5 , 'e');  
    printf("輸出單鏈表L:");  
    DispList(L);  
    l=ListLength(L);  
    printf("單鏈表長度l=%d\n" , l);  
    printf("單鏈表L為%s\n" , (ListEmpty(L)?"空":"非空"));  
    GetElem(L , 3 , e);  
    printf("單鏈表的第3個元素=%c\n" , e);  
    printf ("元素a的位置=%d\n" , LocateElem(L , 'a'));  
    printf("在第4個元素位置上插入f元素\n");  
    ListInsert(L , 4 , 'f');  
    printf("單鏈順序表L:");  
    DispList(L);  
    printf("刪除L的第3個元素\n");  
    ListDelete(L , 3 , e);  
    printf("輸出單鏈表L:");  
    DispList(L);  
    printf("釋放單鏈表L\n");  
    free(L);  
  
return 0;   
}   

結果: