1. 程式人生 > >資料結構---線性表(離散儲存)

資料結構---線性表(離散儲存)

LinkList.h:結構的定義,基本函式的申明

#ifndef __LINKLIST_H__
#define __LINKLIST_H__
 
//一些庫函式的標頭檔案包含
#include <string.h>
#include <ctype.h>
#include <malloc.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <math.h>
 
//自定義bool
typedef int Boolean;
 
//定義函式返回狀態
typedef int Status;
 
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0

typedef struct Node
{
	int data;
	struct Node *next;
}LNode,*LinkList;

/* 初始化 */
Status init(LinkList *list);

/* 銷燬 */
Status destroy(LinkList *list);

/* 重置 */
Status clear(LinkList list);

/* 判空 */
Boolean isEmpty(LinkList list);

/* 獲取已存元素的數量 */
int listLen(LinkList list);

/* 獲取指定索引的元素 */
Status getElem(LinkList list, int index, int *elem);

/* 獲取給定元素值,並滿足關係的第一個元素的索引 */
int LocateElem(LinkList list, int elem, int (*comp)(int, int));

/* 獲取元素的前驅 */
Status getPriorElem(LinkList list, int elem, ElemType *pre_);

/* 獲取元素的後繼 */
Status getNextElem(LinkList list, int elem, int *next_);

/* 插入一個元素 */
Status insertElem(LinkList list, int index, int elem);

/* 刪除一個元素 */
Status deleteElem(LinkList list, int index, int *del_elem);

/* 根據給定關係改變元素的值 */
Status traverse(LinkList list, void (*update)(int *) );

#endif

LinkList.c 函式的實現

#include "LinkList.h"

/* 初始化 */
Status init(LinkList *list)
{
    *list = (LinkList)malloc(sizeof(LNode));
    if(*list == NULL)
    {
        printf("動態記憶體分配失敗");
        exit(-1);
    }
    (*list)->next = NULL;
    return OK;
}

/* 銷燬,連頭結點空間也要釋放 */
Status destroy(LinkList *list)
{
    LinkList p ;
    while(!(*list))
    {
        p = (*list)->next;
        free(*list);
        *list = p;
    }
    *list = NULL;
    return OK;
}

/* 重置 除頭結點外的其他結點都要釋放*/
Status clear(LinkList list)
{
    LinkList q,p = list->next;
    while(!p)
    {
        q = p->next;
        free(p);
        p = q;
    }
    list->next = NULL;
    return OK;
}

/* 判空 */
Boolean isEmpty(LinkList list)
{
    if(list->next == NULL)
    {
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

/* 獲取已存元素的數量 */
int listLen(LinkList list)
{
    int i=0;
    LinkList p = list->next;
    while(!p)
        i++;
        p = p->next;
    }
    return i;
}

/* 獲取指定索引的元素 */
Status getElem(LinkList list, int index, int *elem)
{
    int i=0;
    LinkList p = list->next;
    while(i < index && p)  //從首結點開始向後遍歷,到索引位置停止
    {
        i++;
        p = p->next;
    }

    if(i > index || !p)
    {
        return ERROR;
    }
    
    *elem = p->data;
    return OK;
}

/**
 * 獲取給定元素值,並滿足關係的第一個元素的索引 
 * comp函式型別的返回值是1或0,1表示滿足條件,0表示不滿足條件
**/
int LocateElem(LinkList list, int elem, int (*comp)(int, int))
{
    LinkList p = list->next;
    int i=0;
    while(p)
    {
        if(comp(p->data, elem))
        {
            return i;
        }
        p = p->next;
        i++;
    }
    
    return -1;
}

/* 獲取元素的前驅 */
Status getPriorElem(LinkList list, int elem, int *pre_)
{
    LinkList q,p = list->next;
    while(p && p->next)
    {
        q = p->next;
        if(q->data == elem)
        {
            *pre_ = p->data;
            return OK;
        }
        p = q;
    }
    
    return ERROR;
}

/* 獲取元素的後繼 */
Status getNextElem(LinkList list, int elem, int *next_)
{
    LinkList p = list->next;
    while(p && p->next) //如果獲取第i個元素的後繼,則i+1也必須是有效元素
    {
        if(p->data == elem)
        {
            *next_ = p->next->data;
            return OK;
        }
        p = p->next;
    }
    
    return ERROR;
}

/* 插入一個元素 */
Status insertElem(LinkList list, int index, int elem)
{
    int i=0;
    LinkList s,p = list;
    while(i < index && p) //找到索引的前一個位置
    {
        p = p->next;
        i++;
    }
    
    if(i > index || !p)
    {
        return ERROR;
    }
    
    s = (LinkList)malloc(sizeof(LNode));
    s->data = elem;

    s->next = p->next;  //將第i個元素移動到新結點的後面,即新結點的指標域設為第i個元素的結點  
    p->next = s;        //將第i-1個元素的指標域設為新的結點

    return OK;
}

/* 刪除一個元素 */
Status deleteElem(LinkList list, int index, int *del_elem)
{
    int i=0;
    LinkList q,p = list;
    while(p && i < index)
    {
        p = p->next;
        i++;
    }

    if(i > index || !p)
    {
        return ERROR;
    }
    
    q = p->next;  // 將待刪的結點賦值給q
    p->next = q->next; //將待刪結點的指標域 賦值給 待刪結點的前一個結點的指標域

    *del_elem = q->data;
    free(q);
    
    return OK;
}

/* 根據給定關係改變元素的值 */
Status traverse(LinkList list, void (*update)(int *))
{
    LinkList p = list->next;
    while(p)
    {
        update(&(p->data));
        p = p->next;
    }
    printf("\n");
    return OK;
}