2、例如:
void InsertSeqList(SeqList L, DataType x, int i)
{ //将元素x插入到顺序表L的第i个数据元素之前
if(L.length==Maxsize)exit("表已满")
if(i<1||i>L.length+1) exit("位置错")
for (j=L.lenghtj>=ij--)
L.data[j]=L.data[j-1]//平移插入点之后的数据
L.data[i-1]=x//在插入点插入数据
L.length++
}
L.data[j]=L.data[j-1]的意思是把要插入的位置后的数据都依次往后面移动一位,比如要插入在第6个位置上,共8个数据的链表里,先把第8个数据复制到第9个位置上,在把第7个数据复制到第8个位置上,在把第6个数据复制到第7个位置上。这样第6个位置后就可以写入,覆盖掉以前的值就好了。这样做的意思是腾出可以插入的地方而不破坏数据的顺序排放。
/*
GY52122008
请输入插入字符 : -
请输入插入位置 : 7
GY5212-2008
Press any key to continue
*/
#include <malloc.h>#include <stdio.h>
#include <string.h>
#define maxsize 100
typedef struct {
char *data
int length
}sqlist
void initlist(sqlist *&L) { //初始化顺序表
L = (sqlist *)malloc(sizeof(sqlist))
L->data = (char *)malloc(maxsize)
L->length = 0
}
void createlist(sqlist *&L,char a[],int n) { //建立顺序表
int i
for(i = 0i < ni++) L->data[i] = a[i]
L->length = n
}
bool listinsert(sqlist *&L,int i,char e) { //插入数据元素
int j
if(i < 1 || i > L->length + 1) return false
i--
for(j = L->lengthj > ij--) L->data[j] = L->data[j - 1]
L->data[i] = e
L->length++
return true
}
bool listdelete(sqlist *&L,int i,char &e) { //删除数据元素
int j
if(i < 1 || i> L->length) return false
i--
e = L->data[i]
for(j = 1j < L->length - 1j++) L->data[j] = L->data[j + 1]
L->length--
return true
}
int listlength(sqlist *L) { //求线性表长度
return(L->length)
}
void destroylist(sqlist *&L) {
free(L)
}
int locateelem(sqlist *L,char e) { //按元素查找
int i = 0
while(i < L->length && L->data[i] != e) i++
if(i >= L->length) return 0
else return i + 1
}
void displist(sqlist *L) { //输出线性表
int i
for(i = 0i < L->lengthi++) printf("%c",L->data[i])
printf("\n")
}
int main() {
int pos,len
char ch,data[50] = "GY52122008"
sqlist *L
initlist(L) // 先初始化
len = strlen(data)
createlist(L,data,len) // 创建表
displist(L)
printf("请输入插入字符 : ")
scanf("%c",&ch)
printf("请输入插入位置 : ")
scanf("%d",&pos)
if(listinsert(L,pos,ch)) displist(L)
else printf("插入操作失败。\n")
free(L->data)
free(L)
return 0
}