线性表及实现

概念:由同类型数据元素沟成有序序列的线性结构。

抽象数据类型描述

类型名称:线性表(List)
数据对象集:n个元素构成的有序序列(a1,a2,a3,…,an)
操作:

  1. List MakeEmpty()–构造一个空的线性表
  2. ElementType FindKth(int k, List L)–查找k位置的元素
  3. int Find(ElementType X,List L)–查找元素X在线性表L中第一次出现的位置
  4. void Insert(ElementType X, int i, List L)–在i位置前插入元素X
  5. void Delete(int i, List L)–删除i位置的元素
  6. int Length(List L)–返回线性表L的长度

数组实现线性表

#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE  1024

typedef int ElementType;
typedef struct LNode* List;

struct LNode
{
    ElementType Data[MAXSIZE]; //存放元素的数组
    int last;                  //最后一个元素的索引
};

/**
 * @brief 初始化,创建一个空链表
 *
 * @return List
 */
List MakeEmpty()
{
    List Ptrl = (List)malloc(sizeof(struct LNode));
    for (int i = 0; i < MAXSIZE; i++)
    {
        Ptrl->Data[i] = 0;
    }

    Ptrl->last = -1;
    return Ptrl;
}

/**
 * @brief 查找元素X在线性表的位置
 *
 * @param X
 * @param L
 * @return int
 */
int Find(ElementType X, List L)
{
    for (int i = 0; i <= L->last; i++)
    {
        if (L->Data[i] == X)
        {
            return i;
        }
    }
    return -1;
}

/**
 * @brief 在索引i处插入元素x
 *
 * @param X
 * @param i
 * @param L
 */
void Insert(ElementType X, int i, List L)
{
    if (i<0 || i>L->last+1)
    {
        printf("位置越界");
        return;
    }
    /*
    在i处插入新元素,则i处的原元素及后续元素均后移一位
     */
    for (int j = L->last; j >= i; j--)
    {
        L->Data[j + 1] = L->Data[j];
    }
    L->Data[i] = X;
    L->last++;
}

/**
 * @brief 删除序列表L中索引i处的元素
 *
 * @param i
 * @param L
 */
void Delete(int i, List L)
{
    if (i<0 || i>L->last+1)
    {
        printf("索引越界");
        return;
    }
    /*
    删除索引i处的元素,则i+1处及其后面所有的元素均前移一位
    */
    for (int j = i; j <= L->last - 1; j++)
    {
        L->Data[j] = L->Data[j + 1];
    }
    L->last--;
}

int main()
{
    List list = MakeEmpty();
    Insert(0, 0, list);
    Insert(1, 1, list);
    Insert(2, 2, list);
    Insert(3, 3, list);
    Insert(4, 4, list);
    Insert(5, 5, list);

    int index = Find(3, list);

    Delete(2, list);

    Insert(2, 2, list);

    return 0;
}

链表实现线性表

#include <stdio.h>
#include <stdlib.h>

typedef int ElementType;
typedef struct LNode* List;

struct LNode
{
	ElementType Data;
	List Next;
};


/*
* 求线性表元素的数量
*/
int lenth(List list)
{
	int i = 0;
	List temp = list;
	while (temp)
	{
		temp = temp->Next;
		i++;
	}
	return i;
}

/*
查找索引k位置的元素
*/
ElementType FindKth(int k, List list)
{
	int index = 0;
	List temp = list;
	while (temp != NULL)
	{
		if (k > index)
		{
			temp = temp->Next;
			index++;
		}
		else
		{
			break;
		}
	}
	if (temp == NULL)
	{
		return NULL;
	}
	else
	{
		if (index == k)
		{
			return temp->Data;
		}
		else
		{
			return NULL;
		}
	}
}

List Find(int index, List L)
{
	List p = L;
	for (int i = 0; i < index; i++)
	{
		p = p->Next;
	}
	return p;
}

List Insert(ElementType X, int i, List L)
{
	List p, s;
	if (i == 0)
	{
		s = (List)malloc(sizeof(struct LNode));
		s->Data = X;
		s->Next = L;
		return s;
	}
	p = Find(i-1, L);
	if (p == NULL)
	{
		printf("参数越界");
		return NULL;
	}
	else
	{
		//索引i-1的元素是p,
		s = (List)malloc(sizeof(struct LNode));
		s->Data = X;
		s->Next = p->Next;
		p->Next = s;
		return L;
	}
	return NULL;
}

List Delete(int i, List list)
{
	List p, s;
	if (i == 0)
	{
		s = list;
		if (list != NULL)
		{
			list = list->Next;
		}
		else
		{
			return NULL;
		}
		free(s);
		return list;
	}
	p = Find(i-1, list);
	if (p == NULL)
	{
		return NULL;
	}
	else if (p->Next == NULL)
	{
		return NULL;
	}
	else
	{
		s = p->Next;
		p->Next = s->Next;
		free(s);
		return list;
	}
}

int main()
{
	List list = Insert(0, 0, NULL);
	Insert(1, 1, list);
	Insert(2, 2, list);
	Insert(3, 3, list);

	Delete(2, list);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值