线性表的建立及操作详解 菜鸟都能看懂的教程

线性表按照存储方式可以分为顺序存储和链式存储.
我们先来实现顺序表,借助一维数组来实现

定义顺序表

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#define  MAXSIZE 100
typedef struct List
{
	int data[MAXSIZE];
	int length;
}List;

初始化顺序表

void initList(List * plist)
{
	assert(plist);
	memset(plist->data, 0, MAXSIZE * 4);
	plist->length = 0;
}

判断顺序表是否为空

int ListEmpty(List * plist)
{
	assert(plist);
	//空为0,非空为-1;
	if (plist->length == 0)
		return 0;
	else
		return -1;
}

清空顺序表

void clearList(List * plist)
{
	assert(plist);
	plist->length = 0;
}

寻找第i个元素

int GetElem(List * plist, int i, int *e)
{
	//成功为0,不成功为-1;
	assert(plist);
	if (i<1 || i>plist->length||plist->length == 0)
		return -1;
	*e = plist->data[i - 1];
	return 0;
}

寻找元素e在顺序表中的位置

int LocateElem(List *plist, int e)
{	
	int i;
	assert(plist);
	for (i = 1; i <= plist->length; i++)
	{
		if (plist->data[i] == e)
		{
			return i;
		}
	}
	return 0;
}

在第i个位置插入数据e

int ListInsert(List *plist, int i,int e)
{
	int k;
	//插入成功为0,失败为-1;
	assert(plist);
	if (plist->length == MAXSIZE)
		return -1;
	if (i<1 || i>plist->length + 1)
		return -1;
	
	for (k = plist->length - 1; k >= i - 1; k--)
	{
		plist->data[k + 1] = plist->data[k];
	}
	plist->data[i-1] = e;
	plist->length++;
	return 0;
}

删除第i个位置的元素,用e返回值

int ListDelete(List * plist, int i, int *e)
{
	int k;
	assert(plist);
	if (i<1 || i>plist->length + 1)
		return -1;
	if (plist->length == 0)
		return -1;
	*e = plist->data[i - 1];
	for (k = i - 1; k < plist->length; k++)
	{
		plist->data[k] = plist->data[k + 1];
	}
	plist->length--;
	return e;
}

得到顺序表长度

int ListLength(List *plist)
{
	return plist->length;
}
void print(List *plist)
{
	for (int i = 0; i < plist->length; i++)
	{
		printf("%d ", plist->data[i]);
	}
}

主函数

int main()
{
	List p;
	List * plist = &p;
	initList(plist);
	ListInsert(plist, 1, 34);
	ListInsert(plist, 2, 3);
	ListInsert(plist, 3, 35);
	ListInsert(plist, 1, 6);
	ListInsert(plist, 2, 45);
	ListInsert(plist, 6, 55);
	int e, k, pp;
	//GetElem(plist,5, &e);
	print(plist);
	system("pause");
	return 0;
}

在这里插入图片描述

链表实现

单链表的定义

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
typedef struct ListNode
{
	struct ListNode * next;
	int data;
}ListNode;
typedef struct Link
{
	struct ListNode * head;
}Link;

初始化单链表

void initLink(Link * plist)
{
	assert(plist);
	plist->head = NULL;
}

销毁单链表

void ListDestroy(Link* plist)
{
	assert(plist);
	ListNode * tmp;
	while (plist->head)
	{
		tmp = plist->head;
		plist->head = plist->head->next;
		free(tmp);
	}
}

头插

void PushFront(Link * plist, int x)
{
	assert(plist);
	ListNode * tmp = (ListNode *)malloc(sizeof(ListNode));
	tmp->data = x;
	tmp->next = plist->head;
	plist->head = tmp;
}

头删

void  PopFront(Link *plist)
{
	assert(plist);
	ListNode * tmp;
	if (plist->head != NULL)
	{
		tmp = plist->head;
		plist->head = tmp->next;
		free(tmp);
	}
}

查找

ListNode * Listfind(Link * plist,int x)
{
	assert(plist);
	ListNode * tmp;
	for (tmp = plist->head; tmp; tmp=tmp->next)
	{
		if (tmp->data == x)
		{
			return tmp;
		}
	}
	return NULL;
}

第i个位置上插入x

int  LinkInsert(Link* plist,int i,int x)
{
	int j=1;
	assert(plist);
	ListNode * tmp = plist->head;
	while (tmp&&j < i-1)
	{
		tmp = tmp->next;
		j++;
	}
	while (!tmp || j > i)
	{
		return -1;
	}
	ListNode * cur = (ListNode*)malloc(sizeof(ListNode));
	cur->data = x;
	if (i == 1)
	{
		cur->next = plist->head;
		plist->head = cur;
	}
	else
	{
		cur->next = tmp->next;
		tmp->next = cur->next;

	}
	return 0;
}

删除第i个位置上的元素

int LinkRemove(Link*plist, int i,int *e)
{
	assert(plist);
	int j=1;
	ListNode * tmp = plist->head;
	while (tmp&&j < i - 1)
	{
		tmp = tmp->next;
		j++;
	}
	if (!tmp || j > i )
	{
		return -1;
	}
	if (i == 1)
	{
		ListNode *y = plist->head;
		*e = y->data;
		plist->head = y->next;
		free(y);
	}
	else {
		ListNode * y = tmp->next;
		*e = y->data;
		tmp->next = tmp->next->next;
		free(y);
	}
	return 0;
}

打印单链表

void print(Link * plist)
{
	assert(plist);
	ListNode * tmp;
	for (tmp = plist->head; tmp; tmp = tmp->next)
	{
		printf("%d->", tmp->data);
	}
}

主函数

int main()
{
	Link L;
	Link * plist = &L;
	initLink(plist);
	PushFront(plist, 1);
	PushFront(plist, 2);
	PushFront(plist, 3);
	PushFront(plist, 4);
	PushFront(plist, 5);
	int e;
	LinkInsert(plist, 1, 10);
	//LinkRemove(plist,1, &e);
//	printf("%d\n", e);

	print(plist);
	
	system("pause");
	return 0;
}

在这里插入图片描述

  • 2
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
链式线性表是由一系列结点组成的链表,每个结点都包含一个数据元素和一个指针域指向下一个结点。链表的头结点没有数据元素,只有一个指针域指向第一个真正的结点。 链式线性表建立可以通过不断地插入新结点来实现。具体步骤如下: 1. 创建头结点,将其指针域设为 NULL。 2. 输入第一个数据元素,创建一个新结点并将数据元素存储在其中,同时让头结点的指针域指向该结点。 3. 重复以上步骤,直到所有数据元素都被插入到链表中。 链式线性表的插入操作可以分为两种情况: 1. 在链表的某个位置插入一个新结点。 2. 在链表的末尾插入一个新结点。 对于情况一,需要先找到要插入的位置,然后创建新结点并将其插入到链表中。具体步骤如下: 1. 找到要插入的位置,即该位置的前一个结点。 2. 创建新结点并将数据元素存储在其中。 3. 将新结点的指针域指向原位置的下一个结点。 4. 将原位置的前一个结点的指针域指向新结点。 对于情况二,只需要创建一个新结点并将其插入到链表的末尾即可。 链式线性表的删除操作也可以分为两种情况: 1. 删除链表的某个位置的结点。 2. 删除链表的末尾结点。 对于情况一,需要先找到要删除的结点,然后将其从链表中删除。具体步骤如下: 1. 找到要删除的结点,即该位置的前一个结点。 2. 将前一个结点的指针域指向要删除结点的下一个结点。 3. 释放要删除的结点的内存空间。 对于情况二,需要先找到链表的末尾结点,然后将其从链表中删除。 链式线性表的合并操作可以将两个链表合并为一个链表。具体步骤如下: 1. 找到第一个链表的末尾结点。 2. 将第一个链表的末尾结点的指针域指向第二个链表的头结点。 3. 释放第二个链表的头结点的内存空间。 4. 返回第一个链表的头结点。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值