本贴总结学习顺序表的心得。
需要注意的就是对要插入的元素判断的处理不要漏掉。
代码如下。
#include <stdio.h>
#include <stdlib.h>
#define size 10
typedef struct{
int *data;
int length;
}Slist;
void Initlist(Slist *L){
L->data=(int*)malloc(sizeof(int)*size);
L->length=0;
return;
}
void insert(Slist*L,int x){
int i=0;
//每种情况最开始时cnt都为0,cnt就是记录移动次数的变量
int cnt=0;
//L为空
if(L->length==0){
L->data[0]=x;
L->length++;
return;
}
//x最小
while(L->data[0]>=x){
L->data[L->length-cnt]=L->data[L->length-cnt-1];// 低位向高位挪动
cnt++;
if(cnt==L->length){
L->data[0]=x;
L->length++;
break;
}
}
//x中间的情况
while(L->data[cnt]<x){
//cnt就代表前面有几个元素
cnt++;
//相等的情况
if(L->data[cnt]==x){
for(i=0;i<L->length-cnt;i++){
L->data[L->length-i]=L->data[L->length-1-i];
}
L->data[cnt]=x;
L->length++;
break;
}
//x比前面小,比后面大
else if(L->data[cnt]>x){
for(i=0;i<L->length-cnt;i++){
L->data[L->length-i]=L->data[L->length-1-i];
}
L->data[cnt]=x;
L->length++;
break;
}
//x为最大的情况
if(cnt==L->length){
L->data[cnt]=x;
L->length++;
break;
}
}
}
void printlist(Slist*L){
int i=0;
for(i=0;i<L->length;i++){
printf("%d ",L->data[i]);
}
printf("\n");
}
int main(){
int f=0;
int i=0;
int x=0;
Slist L;
Initlist(&L);
scanf("%d",&f);
while(f!=0){
insert(&L,f);
scanf("%d",&f);
}
printlist(&L);
scanf("%d",&x);
insert(&L,x);
printlist(&L);
return 0;
}