数据结构(1) —— 线性表顺序实现基本功能

前言

       大家好,我是一名大一的软件工程专业的学生在学习了数据结构这门课程之后想在网上写一些自己学习后的知识复习。如果各位大佬看到我的文章有错误,还希望各位大佬多多指正,谢谢大家。;如果能帮助到大家,那是我的荣幸。

一、线性表的定义和特点

定义:由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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值