上一次复习了数据结构中顺序表的概念,包括怎么样构造一个顺序表。这一次就主要学习了一下顺序表的插入与删除。
对顺序表的增加呢,做法如下:
例如要在一个顺序表的第i个位置插入一个元素,那么首先需要将i-1以后的元素顺序后移一个元素的位置,然后在第i个位置插入新元素,最后给表长加1。但我们要注意的是,在插入之前首先要判断插入的合法性。比如这个顺序表的长度为n,那么插入元素的位置是1~n+1,如果i<1或者i>n+1,或者n=MaxSize(表满),这样插入都是非法的,程序应该直接退出。如果插入的位置是合法的,那么首先将表的i-1以后的元素顺序后移一个元素的位置,即,将顺序表从第i个元素到第n个元素顺序后移一个位置。然后在表第i个位置(其下标为i-1),并将表长加1.
那删除操作也是同理,首先判断它是否为非法删除,判断一个需要删除的元素是否合法。对于一个长度为n的顺序表,删除元素的合法位置是1~n,因此如果i<1或者i>n都是不合法的。 执行删除操作首先将第i位置以后的元素,依次前移,这样第i个元素就会被覆盖,也就起到了删除第i个位置元素的作用,最后将表长-1..
/*静态顺序表的各种操作*/
/*实例:
创建一个静态的顺序表存放整数,大小为10,完成以下的操作。
(1)输入6个整数,打印出顺序表中的内容,并显示表中剩余的空间个数
(2)在顺序表中的第3个位置插入元素0,打印出顺序表中的内容,并显示表中剩余的空间个数
(3)再试图向表中第11个位置插入整数0,程序提示超出范围
(4)删除表中第6个元素,打印出顺序表中的内容,并显示表中剩余的空间个数
*/
#include "stdio.h"
#define MaxSize 10
/*
参数Sqlist:表的首地址
参数*len:表的长度
参数i:插入元素的位置
参数x:待插入的元素值
*/
void insertElem(int Sqlist[],int *len,int i, int x)
{
int t;
if(*len == MaxSize || i<1 || i>*len+1)
{
printf("This insert is illegal\n");
return; //非法插入
}
for(t = *len-1;t>=i-1;t--)
{
Sqlist[t+1] = Sqlist[t];
}
Sqlist[i-1]=x; //插入元素
*len = *len+1; //表长+1
}
void DelElem(int Sqlist[],int *len,int i)
{
int j;
if(i<1 || i>*len)
{
printf("This insert is illegal");
return; //非法插入
}
for(j=i;j<*len-1;j++)
{
Sqlist[j-1] = Sqlist[j];
}
*len = *len-1;
}
//测试函数
void main()
{
int Sqlist[MaxSize]; //定义一个静态顺序表
int len;
int i;
printf("please input six integer number \n");
for(i=0;i<6;i++)
scanf("%d",&Sqlist[i]);
len=6;
for(i=0;i>len;i++)
printf("%d ",Sqlist[i]);
printf("\n The spare length is %d\n",MaxSize - len); // 显示表中剩余空间
insertElem(Sqlist,&len,3,0); // 在表中第3位置插入整数0
for(i=0;i<len;i++)
printf("%d ",Sqlist[i]); //输出表中所有元素
insertElem(Sqlist,&len,11,0); //在表中第11位置插入整数0
DelElem(Sqlist,&len,6); //删除顺序表中第6个元素
for(i=0;i<len;i++)
printf("%d ",Sqlist[i]);
printf("\n The spare Length is %d \n",MaxSize - len);
}
那么动态的顺序表的插入删除则是同理,实例见下面,相信大家也很容易看懂逻辑了。
/*
动态创建一个顺序表
要求:顺序表的初始长度为10,向顺序表中输入15个整数,并打印出来。再删除表中第5个元素,打印删除后的结果
*/
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define MaxSize 10
typedef int ElemType;
typedef struct{
int *elem;
int length;
int listsize;
} Sqlist;
// 初始化一个顺序表 参数L:Sqlist类型的指针
void initSqlist(Sqlist *L)
{
L->elem = (int *)malloc(MaxSize*sizeof(ElemType));
if(!L->elem)
exit(0);
L->length = 0;
L->listsize=MaxSize;
}
//向顺序表中插入 元 素
/*
参数L:Sqlist类型的指针
参数i:插入元素的位置
参数item:插入的元素
*/
void InsertElem(Sqlist *L,int i, ElemType item)
{
//向顺序表L中的第i个位置插入元素item
ElemType *base,* insertPtr,*p;
if(i<1 || i>L->length+1)
exit(0);
if(L->length >= L->listsize)
{
base = (ElemType*)realloc(L->elem,(L->listsize+10)*sizeof(ElemType));
L->elem = base;
L->listsize = L->listsize+100;
}
insertPtr = &(L->elem[i-1]);
for(p=&(L->elem[L->length-1]);p>=insertPtr;p--)
*(p+1)=*p;
* insertPtr =item;
L->length++;
}
/*
从顺序表中删除元素
参数L:Sqlist类型的指针
参数i:删除元素的位置
*/
void DelElem(Sqlist *L,int i)
{
//从顺序表L中删除第i个元素
ElemType *delItem, *q;
if(i<1 || i>L->length)
exit(0);
delItem = &(L->elem[i-1]);
q=L->elem+L->length-1;
for(++delItem; delItem<=q; ++ delItem)
*(delItem-1)=* delItem;
L->length--;
}
//测试函数
void main()
{
Sqlist l;
int i;
initSqlist(&l); // 初始化一个顺序表
for(i=0;i<15;i++)
InsertElem(&l,i+1,i+1); //向顺序表中插入1~15
printf("The context of the list is\n");
for(i=0;i<l.length;i++)
printf("%d ",l.elem[i]); //打印顺序表中的内容
DelElem(&l,5); //删除第5个元素(内容为5)
printf("\nDelete the fifth element\n");
for(i=0;i<l.length;i++)
printf("%d ",l.elem[i]);
getchar();
}
以上2个实例代码都是调试通过的。大家可以自己动手试试写几个测试的函数。
写在后面:
其实博主也不是大一的新生了,今年已经走上了工作岗位,无奈自己水平太菜 ,找到的工作基本都无关数据结构与算法。博主也经常和女朋友讨论什么对编程是最重要的呢,我们两个都认为,就是分析问题,解决问题。那么就算是平时用不到,也要努力学习算法和数据结构以及数学。(因为我觉得长时间不学数学,智力真的会下降的!)
尽管上面的代码,帮不了你搭一个网站,甚至不能帮你完成一次小作业。但是,聚沙成塔,这些东西学到脑子里,肯定是没错的!