前言
边学、边敲、边更
数据结构——线性表,学习过程中的一些记录,欢迎童鞋们交流指正~~
提示:以下是本篇文章正文内容,下面案例可供参考
一、什么是线性表
线性表是具有相同数据类型的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 =