暗红色字体是删除元素的方法体
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h> //有一些编译器可能不需要引入malloc.h头文件
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef struct{
int length;
int *elem ;
int listsize;
}SqList;
SqList InitList_Sq(SqList L){
L.elem = (int *)malloc(LIST_INIT_SIZE*sizeof(int));
int k = 0;
if(!L.elem)exit(1);
L.length = 0;
L.listsize = LIST_INIT_SIZE;
return L;
}
//在顺序线性表L中第i个位置之前插入新的元素e
//线性表的顺序表示在插入元素的时候需要把插入位置之后的元素都向后移动一个位置
//L:将要被操作的线性表,i要插入的位置,e要插入的元素
SqList ListInsert_Sq(SqList L,int i ,int e){
printf("被插入的元素是%d\n",e);
//首先判断i值是否合法
if(i<1||i>L.length+1){printf("你选择要插入的位置已经超出了线性表的界限\n");return L;}
if(L.length >= L.listsize){
int *newbase = (int *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(int));
if(!newbase)exit(1);
L.elem = newbase;
L.listsize = L.listsize+LISTINCREMENT;
printf("内存不足,需要扩充");
}
int *q = (L.elem+i-1);//要插入的位置
printf("插入位置的当前值是 %d\n", *q);
int *p;
if(L.length>0)
for (p = (L.elem+(L.length-1));p>=q;--p)
{
printf("表尾的元素值是%d\n",*(L.elem+(L.length-1)));
*(p+1) = *p;//从最后一个元素开始把元素依次向后移动一个位置
printf("被移动的元素是%d\n",*(p+1));
}
*q = e;
++L.length;
return L ;
}
SqList ListDelete_Sq(SqList L,int i){
if(i<1||i>L.length+1)
{
printf("你要删除的元素位置超出了表的界限");
return L;
}
int *q = L.elem+i-1;//要删除的位置
printf("要删除的数值是%d\n",*(q));
int *p = L.elem+(L.length-1);//表最后一个元素的位置
for(q+1;q+1<=p;q++)//把要删除位置的元素依次向左移动一个位置
{
*q = *(q+1);
}
--L.length;
return L;
}
void printList(SqList L){
printf("-----------------------------\n");
int i;
int array[L.length];
for(i = 0;i<(L.length);i++){
array[i] = *(L.elem+i);
printf("L[%d]=%d\n",i,array[i]);
}
printf("-----------------------------\n");
}
int main(void){
SqList L;
L = InitList_Sq(L);
printf("%d\n",L.length);
L = ListInsert_Sq(L,5,1);
L = ListInsert_Sq(L,1,1);
L = ListInsert_Sq(L,1,1);
L = ListInsert_Sq(L,1,2);
L = ListInsert_Sq(L,1,3);
L = ListInsert_Sq(L,1,4);
printf("%d\n",L.length);
printList(L);
L = ListDelete_Sq(L,3);
printList(L);
system("PAUSE");
return 0;
}