顺序表如何插入元素? 看这里!!
设计算法:将一个元素插入到有序的顺序表中,使顺序表仍有序,并编写主函数测试算法。
1. 算法:
①将一个顺序表利用冒泡排序的方法从小到大排序;
②将要插入的数据x与顺序表的元素一一进行比较,如果存在相等的话,停止插入;
③如果x位于顺序表某两个相邻的元素a、b之间,b元素的位置就“让”给x,在插入x之前,先把位于b之后的元素向后移动一位,注意,是从顺序表最后一个元素开始移动,直到把b也挪到下一个位置,从而空出b的位置,此时,将x插入。
2. 代码:
#include<stdio.h> #include<stdlib.h> #define MAXSIZE 20 #define OK 1 #define OVERFLOW 0 #define ERROR 0 typedef struct{ int *data; int length; }SqList; //初始化 int Init_L(SqList &L){ L.data=(int *)malloc(sizeof(int)*MAXSIZE); //为顺序表分配内存地址 if(!L.data){ exit(OVERFLOW); //内存分配失败,退出 } L.length=0; return OK; } //给顺序表存值 void Filled_L(SqList &L) { int arr[5]={1,10,5,2,25}; int i=0; //将数组里面的值通过循环赋值给顺序表 for(i=0;i<5;i++) { L.data[i]=arr[i]; L.length++; } } //展示顺序表 void Show_L(SqList &L){ for(int i=0;i<L.length;i++){ printf("%d ",L.data[i]); } printf(" "); } int Len_L(SqList L){ return L.length; } //为顺序表排序 void Order_L(SqList &L){ //利用冒泡排序的方法对顺序表进行排序 int i=0,j=0,temp=0; for(i=0;i<L.length-1;i++){ for(j=0;j<L.length-1-i;j++){ if(L.data[j]>L.data[j+1]){ temp=L.data[j]; L.data[j]=L.data[j+1]; L.data[j+1]=temp; } } } } //插入一个值 int Insert_L(SqList &L,int x){ int i=0,j=0; if(L.length==MAXSIZE-1){ //检查插入位置的合理性,如果表满了,就不能插入元素 printf("Postion is full "); } for(i=0;i<L.length;i++){ if(x==L.data[i]){ //当插入数据等于顺序表中的任一元素时,无法保持顺序性,无法插入 return ERROR; } if(x>L.data[i] && x<L.data[i+1]){ //边遍历边比较,同时顺序表挪位置!!! for(j=L.length-1;j>=i;j--){ //如果插入的元素的大小位于顺序表中任一相邻两个元素之间,则插入元素 L.data[j+1]=L.data[j]; } L.data[i+1]=x; L.length++; } } } int main(){ SqList L; Init_L(L); int x=0; Filled_L(L); printf("SqList is ... "); Show_L(L); int len=0; len=Len_L(L); printf("The length of SqList is %d ",len); printf("SqList after order is ... "); Order_L(L); Show_L(L); printf("Please input x to insert "); scanf("%d",&x); Insert_L(L,x); printf("SqList after insert is ... "); Show_L(L); }
3. 运行结果