线性表的插入和删除

hello,大家好,又见面了,这次我们来讲讲线性表

线性表其实跟数组差不多,但多了一个指针的传递

我们先来看看线性表的定义:

typedef struct {

int *elem;

int length;          //这里我们定义了线性表的长度,也就是元素的个数了//

int listsize;           //这个就是我们线性表的存储容量了//

}Sqlist;

这样就定义完了,是不是很OK,接下来我们看看怎么创建线性表

1.创建函数

int Initlist_Sq(Sqlist *L){

L->elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int));    //分配存储空间,malloc函数用来分配,elem用来保存我们分配的空间的地址//

if(!L->elem) exit(ERROR);                                           //还没懂ing//

L->length=0;                                                                 //初始线性表的长度设为0//

L->listsize=LIST_INIT_SIZE;                                        //这个list什么size是我们一开始就define(宏定义)的一个值哦//

return OK;

}

一个分配空间函数,几个赋值,一个简单的线性表就被创造出来啦

2.插入函数

进入我们的第一个功能函数,插入

大家想一想数组的内容,a[0],a[1].......数组就是通过这样来保存值的,那我们要插入一个怎么办

没错,就是用中间变量,用中间变量来保存插入那个位置的量如何通过一个for或者while循环我们就可以把值传递下去了

这样我们就在线性表的中间插入了一个值

int ListInsert_Sq(Sqlist *L,int i,int e){

if(i<1||i>L->length+1) return ERROR;                       //如果我们输入插入的位置大于线性表的长度怎么办,一个if帮你解决//

int *newbase,*q,*p;

if(L->length>=L->listsize){                                        //这个if就是用来判断我们现在拥有的空间是不是足够再插入进一个元素,不够的话我们就需要再分配一下了//

newbase=(int *)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(int));

if(!newbase) exit(ERROR);

L->elem=newbase;                                              //我们把新开辟的空间地址传递一下//

L->listsize+=LISTINCREMENT;                           //这个就是用来增加我们拥有的空间的了//

}

q=&(L->elem[i-1]);                                                      //我们上面提到的中间变量哦//

for(p=&(L->elem[L->length-1]);p>=q;--p)    *(p+1)=*p;    //for循环把后面的值

*q=e;

++L->length;                                                                 //这里我只能说,没用,因为要用到指针传递,不然这个长度好像就没用传递回去,我依旧又用了外部变量,大家有更好解决方案或者对指针熟悉的可以在评论区里告诉我哦

return OK;

}

3.删除函数

删除删除删除,大家想一下,线性表怎么删除呢?

还是拿数组来作对比,想删除一个中间的东西,其实就是把后面的元素覆盖到前面来,占据那个你想删除的位置

int ListDelete_Sq(Sqlist *L,int i){

if(i<1||(i>L->length)) return ERROR;                //已经是第4个了吧,判断输入的位置//

int *p,*q,e;

p=&(L->elem[i-1]);                                           //把删除的位置告诉p,注意是i-1哦,因为线性表是从0开始的哦//

  e=*p;                                                                //留作纪念的e//

q=L->elem+L->length-1;                                  //怎么突然冒出来一个q呢,大家想一想,我们要把后面的元素全部往前移,那怎么判断到底了呢,这里就设置了一个                                                                                         q,作为结束的标志//

for(++p;p<=q;++p)    *(p-1)=*p;                        //这个就是用来覆盖的啦//

return OK;

}

4.主函数

好了,总于到了主函数了,不容易,坚持一下,马上就完了

void main()

{

Sqlist L;                                                       //定义一个线性表//

int i,len,e,a,b;

Initlist_Sq(&L);             //创建线性表//

printf("请输入线性表的长度:   ");

scanf("%d",&len);

L.length=len;

printf("请输入线性表的元素:   ");

for(i=0;i<len;i++){

scanf("%d",L.elem+i);

L.listsize--;                                                //每输入一个元素,存储空间也就会相对的减少//

}

printf("\n请选择 1,插入  2,不插入  :");

scanf("%d",&a);

if(a==1){

printf("请输入要插入的元素:  ");

scanf("%d",&e);

printf("请输入要插入的位置:  ");

scanf("%d",&i);

    ListInsert_Sq(&L,i,e);

      printf("插入后的线性表为\n");

    for(i=0;i<len+1;i++){                               //大家还记得我在上面说到过的长度返回不了吧,因为只插入一次,所以我们就直接+1了,有点投机取巧,哎//

printf("%d   ",L.elem[i]);                         //看这个输出元素,是不是真的跟数组差不多呀,是不是//

}

}

  else

    a=0;                                                    //为什么冒出来一个a=0呢,后面就知道啦//

printf("\n请选择 1,删除  2,不删除  :");

scanf("%d",&b);

if(b==1)

   {

printf("请输入要删除元素的位置:  ");

scanf("%d",&i);

    ListDelete_Sq(&L,i);

    printf("删除后的线性表为\n");

    for(i=0;i<len+a-1;i++){                           //同样是长度不能返回,为什么这里不一样呢,因为删除首先就要-1,但是我们还要判断之前是不是进行了插入操作,所以                                                                                就用到a啦//

printf("%d   ",L.elem[i]);

}

  }

}

ok,单链表就到这里了,其实对于这种简单的插入和删除操作,我们可以试着加入更多操作,像菜单界面啊,文件保存和打开啊,大家加油!!!

有不对的希望大家帮忙指出来哦!!

原文地址:https://www.cnblogs.com/tqdlb/p/11632031.html

时间: 2024-12-14 10:30:01

线性表的插入和删除的相关文章

用C语言实现顺序表的插入和删除算法

什么是线性表? 线性表是n个数据元素的有限序列.根据线性表的显现方式,线性表又分为顺序表(数据元素在内存中的存储空间是连续的)和链表(数据元素在内存中的存储空间是不连续的). 线性表如何用C语言实现?线性表可以进行哪些操作? 在C语言中,线性表通过结构体的方式来实现.结构体中定义了线性表的存储空间地址,当前长度,和当前分配的存储容量.操作包含在指定位置插入某一元素.删除指定元素.查找指定的元素等.在这里重点介绍插入和删除算法. 下面就是关于这一部分内容的陈述. 线性表的C语言实现 需要先定义好的

线性表算法-插入

线性表算法-插入

Sql Server 在已知表中插入、删除、修改某一列操作

--1.向已有表中增加一列 ALTER TABLE TableName ADD ColumnName VARCHAR(20) NULL --2.删除表中的某一列 ALTER TABLE TableName DROP COLUMN ColumnName --3.修改某一列的数据类型 ALTER TABLE TableName ALTER COLUMN ColumnName INT 2.查询当年或者当月的数据 1.查询当年的数据 SELECT * FROM UserInfo WHERE YEAR(R

线性表的插入操作实现

重点思想: 当在线性表中插入一个元素时,插入位置的所有元素都后移一位 考虑因素: 线性表是否是满线性表 线性表插入位置是否可行 1 class linearlist_insert_elem(): 2 def __init__(self, data, maxsize): 3 self.data = data 4 self.maxsize = maxsize 5 self.length = len(data) 6 def list_insert(self, i, e): 7 if self.leng

PTA 线性表元素的区间删除

6-8 线性表元素的区间删除 (20 分) 给定一个顺序存储的线性表,请设计一个函数删除所有值大于min而且小于max的元素.删除后表中剩余元素保持顺序存储,并且相对位置不能改变. 函数接口定义: List Delete( List L, ElementType minD, ElementType maxD ); 其中List结构定义如下: typedef int Position; typedef struct LNode *List; struct LNode { ElementType D

在已知线性表中插入/删除元素的代码

#include "sqlist_h.h" void main(){ SqList L; int n; int e; InitList_Sq(L); cout<<"请输入初始建立线性表的长度n(<=100):"; //printf("请输入初始建立线性表的长度n(<=100):"); cin>>n; //scanf(&n); for(int i=1;i<=n;i++) { cin>>L

简单顺序表的插入,删除,指定位置,指定元素的插入删除操作

头文件 SeqList.h #ifndef __SEQLIST_H__ #define __SEQLIST_H__ #include<stdio.h> #include<string.h> #include<assert.h> #define MAX_SIZE 10 typedef int DataType; typedef unsigned int size_t; typedef struct SeqList { DataType array[MAX_SIZE]; s

顺序表的插入和删除、数组的增删改查和二分查找

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 24.0px "PingFang SC" } span.s1 { font: 24.0px Helvetica } 1.顺序表的表示 为实现顺序表的操作,首先要将其表示出来,用同数据类型的数组和表示数组的长度的整型变量表示. public class LineList{ private int[] data; private int length; public LineList(){ } pu

用Java操纵HBase数据库(新建表,插入,删除,查找)

java代码如下: package db.insert; /* * 创建一个students表,并进行相关操作 */ import java.io.IOException; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseCo