数据结构专题
前言
数据结构作为一项重要的课程,涉及到计算机很多领域,所以打好数据结构基础也尤为重要。本文先从顺序表来简单引入数据结构的具体内容。
一、顺序表是什么?
线性表是n个具有相同特性的数据元素的有限序列。 线性表是一种较为广泛使用的数据结
构,常见的线性表有:链表、顺序表,栈、队列等。
线性表在逻辑上是线性结构,也就说是形态连续。但是在物理结构上可能不连续,线性表在存储时,通常是以顺序存储和链式存储的形式。
二、顺序表结构
1.顺序表结构图
顺序存储如下所示:
0 | 1 | 2 | 3 | 4 |
链式存储如下所示:
2.样题引入
样例实现内容:递增顺序表的数据插入
问题如下:
【问题描述】
设有递增有序顺序表,实现其插入多个元素后依然有序。
【输入形式】
第一行输入一个N(N不大于100),一个M(M不大于100);
第二行输入N个整数(假设输入序列按照递增顺序,以空格分隔),建立顺序表;
接着输入M个整数,插入到顺序表;
【输出形式】
输出插入M个数据元素后的顺序表(要求仍然为递增有序)。
【样例输入】
5 4
12 25 35 98 125
77
-1
34
65
【样例输出】
-1 12 25 34 35 65 77 98 125
3.代码解答
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>typedef int SLDataType;
typedef struct SeqList
{
SLDataType* a; //指向动态开辟数组的指针
int size; //有效的数据个数
int capacity; //容量的大小
}SeqList;
//初始化
void SeqListInit(SeqList* ps)
{
ps->a=NULL;
ps->size=0;
ps->capacity=4;
}
void Expand(SeqList* ps)
{
int newcapacity=ps->capacity==0 ? 4 : ps->capacity * 2;
SLDataType* tmp=(SLDataType*)realloc(ps->a,ps->capacity * sizeof(SLDataType));
if (tmp==NULL)
{
printf("realloc fail");
exit(-1);
}
else
{
ps->a=tmp;
ps->capacity=newcapacity;
}
}
//顺序表的头部插入元素
void SeqListPushBack(SeqList* ps,SLDataType x)
{
//第一次进行插入 的时候 不管是头 尾 插入 都必须直接进入扩容阶段
Expand(ps);
int end=ps->size-1;
while (end>=0)
{
ps->a[end+1]=ps->a[end];
--end;
}
ps->a[0]=x;
ps->size++;
}
void SeqListPrint(SeqList* ps)
{
int i=0;
for(i=0;i<ps->size;i++)
{
printf("%d ",ps->a[i]);
}
}
void SeqListDestory(SeqList* ps)
{
free(ps->a);
ps->a = NULL;
ps->size=ps->capacity=0;
}
//pos不是0这个数字 在现在的元素里是没有0这个数的 0表示的是数组下标
void SeqListInsert(SeqList* ps,int pos,SLDataType x)
{
if (ps->size==ps->capacity)
{
Expand(ps);
}
int end=ps->size-1;
while(end>=pos)
{
ps->a[end+1]=ps->a[end];
--end;
}
ps->a[pos]=x;
ps->size++;
}void JH(SeqList* ps)
{
int i, k, j;
for(i=0;i<ps->size-1;i++)
{
for(j=i+1;j<ps->size;j++)
{
if(ps->a[j]<ps->a[i]){
k=ps->a[i];
ps->a[i]=ps->a[j];
ps->a[j]=k;
}
}
}
}void Inteliode()
{
int N, M;
scanf("%d%d",&N,&M);
SeqList st;
SeqListInit(&st);
int i;
for(i=0;i<N;i++)
{
int t;
scanf("%d",&t);
SeqListPushBack(&st,t);
}
for(i=0;i<M;i++)
{
int k;
scanf("%d",&k);
SeqListInsert(&st,0,k);
}
JH(&st);
SeqListPrint(&st);
SeqListDestory(&st);
}int main()
{
Inteliode();
return 0;
}
总结
文章总结:
本文主要简单介绍了顺序表的顺序存储概念和基础操作。