前言
大家好,我是一名大一的软件工程专业的学生在学习了数据结构这门课程之后想在网上写一些自己学习后的知识复习。如果各位大佬看到我的文章有错误,还希望各位大佬多多指正,谢谢大家。;如果能帮助到大家,那是我的荣幸。
一、线性表的定义和特点
定义:由n个数据特性相同的元素构成的有限序列叫线性表。
特点:
1.除了最后一个元素之外,结构中的每一个元素均只有一个直接后继。
2.除了第一个元素之外,结构中的每一个元素均只有一个直接前驱。
二、线性表的顺序结构实现
1.结构体定义
typedef sytruct SQlist
{
elemtype* data;//用于存储空间的基地址
int length;//记录表的长度
}sqlist//将上述的这种结构体变量定义为此种类型
2.结构体的初始化
sqlist* insitsqlist()
{
sqlist* l;
l=(sqlist*)malloc(sizeof(sqlist));
l->data=(elemtype*)malloc(sizeof(elemtype)*minsize);
l->lemgth=0;
return l;
}
三基本操作
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define minsize 100
#define elemtype int
1.创建一个线性表
sqlist* insitsqlist()
{
sqlist* l;
l=(sqlist*)malloc(sizeof(sqlist));
l->data=(elemtype*)malloc(sizeof(elemtype)*minsize);
l->length=0;
return l;
}
2.删除一个线性表
void deletesqlist(sqlist* l)
{
if(l==NULL) printf("该线性表原本就为空");
else
{
l=NULL;
free(l);
printf("该线性表已经注销");
}
}
3.遍历线性表
void Traversqlist(sqlist*l)
{
for(int i=0;i<l->length-1;i++)//l->length这里放的是输入的个数。
{
printf("%d",l->data[i]);
}
printf("一共字符数=%d");
return ;
}注意:
1.现在的线性表是从l->data[0]开始的,所以字符数会比下标大一,所以不用小于等于号。
2.在正常的定义中线性表是要从下标为1的地方开始的,会在下标为0的地方记录自己的字符数。
4.取值
int getelem(sqlist*l,int location)
{
if(l==NULL) exit(0);
if(location>0&&location<=l->length)
return l->data[location-1];
else
printf("位置是非法位置"); return 0;
}
5.取值地址
int location(sqlist*l,elemtype elem)
{
if(l==NULL) exit(0);
for(int i=0;i<l->length;i++)
{
if(elem==l->data[i]);
{
return i+1;
}
}
printf("在线性表中没有找到于elem值相同的位置");
return 0;
}
6.指定位置插入
sqlist* sqlistinsert(sqlist*l,elemtype elem,int address)
{
if(l==NULL) exit(0);
if(l->data[l->length+1]==NULL)
l->data=(elemtype*)realloc(l->data,minsize);
for(int i=l->length;i<=address-1;i--)
{
l->data[i+1]=l->data[i];
}
l->data[address-1]=elem;
l->length+=1;
return l;
}注意:插入操作是想通过将address-1之后的数据向后移动一位来实现,类似于插入排序的方法。
sqlist* sqlistdelete(sqlist*l,int address)
{
if(l==NULL) exit(0);
for(int i=address;i<=l->length;i++ )
{
l->data[i-1]=l->data[i];
}
l->length-=1;
return l;
}注意:删除操作时将address-1之后的数据前移一位将address-1位置的数据覆盖,来实现指定位置数据的删除。
四代码演示
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define minsize 100
#define elemtype int
typedef struct sqlist
{
elemtype*data;
int length;
}sqlist;sqlist* insitsqlist()
{
sqlist* l;
l=(sqlist*)malloc(sizeof(sqlist));
l->data=(elemtype*)malloc(sizeof(elemtype)*minsize);
l->length=10;
for(int i=0;i<10;i++ ) scanf("%d",&l->data[i]);
return l;
}void deletesqlist(sqlist* l)
{
if(l==NULL) printf("该线性表原本就为空");
else
{
l=NULL;
free(l);
printf("该线性表已经注销");
}
}void Traversqlist(sqlist*l)
{
for(int i=0;i<l->length-1;i++)//l->length这里放的是输入的个数。
{
printf("%d",l->data[i]);
}
printf("一共字符数=%d",l->length);
return ;
}int getelem(sqlist*l,int location)
{
if(l==NULL) exit(0);
if(location>0&&location<=l->length)
return l->data[location-1];
else
printf("位置是非法位置");exit(0);
}int location(sqlist*l,elemtype elem)
{
if(l==NULL) exit(0);
for(int i=0;i<l->length;i++)
{
if(elem==l->data[i])
{
return i+1;
}
}
printf("在线性表中没有找到于elem值相同的位置");
return 0;
}sqlist* sqlistinsert(sqlist*l,elemtype elem,int address)
{
if(l==NULL) exit(0);
if(l->data[l->length+1]==NULL)
l->data=(elemtype*)realloc(l->data,minsize);
for(int i=l->length;i<=address-1;i--)
{
l->data[i+1]=l->data[i];
}
l->data[address-1]=elem;
l->length+=1;
return l;
}sqlist* sqlistdelete(sqlist*l,int address)
{
if(l==NULL) exit(0);
for(int i=address;i<=l->length;i++ )
{
l->data[i-1]=l->data[i];
}
l->length-=1;
return l;
}int main()
{
sqlist*l=insitsqlist();
Traversqlist(l);
return 0;
}