数据结构---线性表(离散存储)

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;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值