数据结构实战——线性表(顺序表、链表——单链表、双链表、循环链表、静态链表)

本文深入探讨了线性表的概念,包括顺序表和链表的不同实现方式,如单链表(头插法、尾插法)、双链表、循环链表和静态链表,并提供了相关操作的介绍。通过对线性表的学习,旨在提升数据结构理解和应用能力。
摘要由CSDN通过智能技术生成

前言

边学、边敲、边更
数据结构——线性表,学习过程中的一些记录,欢迎童鞋们交流指正~~
提示:以下是本篇文章正文内容,下面案例可供参考


一、什么是线性表

线性表是具有相同数据类型的n(>=0)个数据元素的有限序列,n为表长,n=0时线性表是一个空表。若用L命名线性表,一般表示为:L=(a1,a2,a3,a4,…an)

线性表分为顺序存储和链式存储。

顺序存储——顺序表

链式存储——{单链表、双链表、循环链表}(借助指针实现);{静态链表}(借助数组实现)

二、顺序表

顺序表的初始化、插入、删除、查询、打印

#include <stdio.h>
#define maxSize 5
//顺序表的结构体定义:
typedef struct Sqlist {
   
	int *elem;
	int length;
	int listsize;
}Sqlist;
//顺序表的初始化
void InitList(Sqlist* L)
{
   
	L->elem = (int*)malloc(maxSize * sizeof(int));
	if (!L)
	{
   
		printf("error");
	}
	else
	{
   
		L->length = 0;
		L->listsize = maxSize;
	}
}
//在指定位置插入一个元素
void ListInsert(Sqlist *L,int i,int e)
{
   
	if (i<1 || i>L->length + 1)
	{
   
		printf("越界");
	}
	if (L->length >= L->listsize)
	{
   
		//printf("最大长度已满!");
		int *p = L->elem;
		L->elem = (int*)malloc((L->listsize + 1) * sizeof(int));//每次插入的元素个数为1 时,动态增加元素个数为1
		for (i = 0; i < L->listsize; i++)
		{
   
			L->elem[i] = p[i];
		}
		L->listsize = L->listsize  + 1;
		free(p);
	}
	for (int j = L->length; j >= i; j--)
	{
   
		L->elem[j] = L->elem[j - 1];
	}
	L->elem[i - 1] = e;
	L->length++;
}
//删除指定位置的元素,并用e返回删除的值
void ListDelete(Sqlist* L, int i, int *e)
{
   
	if (i < 1 || i >= L->elem) {
   
		printf("越界");
	}
	*e = L->elem[i - 1];
	for (int j = i; j < L->length; j++) {
   
		L->elem[j-1] = L->elem[j];
	}
	L->length--;
	return e;
}
//查询顺序表中与e相同的元素,并返回其在顺序表中的位序
void LocateELem(Sqlist L,int e)
{
   
	int c=0;
	for (int i = 0; i < L.length; i++)
	{
   
		if (L.elem[i] == e)
		{
   
			printf("我们要找的元素%d是L中第%d个元素\n", e, i + 1);
		}
		c++;
	}
	if (c == 0) {
   
		printf("要找的元素不存在!");
	}
}
//打印顺序表,按照顺序表中的顺序输出
void printList(Sqlist L)
{
   
	int i;
	for (i = 0; i <L.length; i++)
	{
   
		printf("顺序表第%d个数:%d\n", i + 1, L.elem[i]);
	}
}
//主函数
void main()
{
   
	Sqlist L;
	int e;
	InitList(&L);
	ListInsert(&L, 1, 10);
	ListInsert(&L, 2, 20);
	ListInsert(&L, 3, 30);
	ListInsert(&L, 3, 40);
	ListInsert(&L, 3, 50);
	ListInsert(&L, 3, 60);
	ListInsert(&L, 3, 70);
	ListInsert(&L, 3, 80);
	printList(L);
	ListDelete(&L, 2, &e);
	printList(L);
	printf("\ne=%d\n",e);
	LocateELem(L, 30);
	int l = L.length;
	printf("该顺序表的长度为:%d\n", l);
}

三、链表

1、单链表

1、头插法

代码如下(示例):

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
//头插法创建链表,并实现按位查询、按值查询、插入、删除、求长度
//创建节点
typedef struct LNode {
   
    int data;
    struct LNode* next;
}LNode;
//头插法创建单链表
LNode* Head(LNode* L) {
   
    int x;
    LNode* s;
    L = (LNode*)malloc(sizeof(LNode));//创建头结点
    L->next = NULL;//初始为空链表
    printf("请输入data:(输入9999结束输出)\n");
    scanf("%d", &x);
    while (x != 9999) {
   
        s = 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值