用data数组存储数据, 为了 方便 从下表为1开始存储。
用数组right存储当前序列每一元素的的下一位置的索引。
#include<stdio.h>
#define NOTEXIST -1
int right[101], data[101];
void init_linklist(int n)
{
int i, t, len;
for(i = 1; i <= n; i++ ){
scanf("%d",&data[i]);
}
for(i = 1; i <= n; i++ ){
if(i != n){
right[i] = i+1;//初始数据的索引
}
else
right[i] = 0;
}
}
int find_pre(int x)//找当前位置的前一位置并返回
{
int t = 1;
while(right[t] != 0 && data[right[t]] != x){
t = right[t];
}
if(right[t] == 0){
return NOTEXIST;
}
else
return t;
}
// 由于数组大小固定不可变 所以 这里不能插入到第一个位置
void insert(int *n, int pos, int x)//插入元素到pos 前一位置
{
(*n)++;
int len = *n;
data[len] = x;
int t = find_pre(data[pos]);
printf("t = %d\n",t);
right[len] = right[t];
right[t] = len;
}
int delete_data(int head, int x)//删除 元素 x
{
if(x == data[1]){//处理 删除的是第一个元素的情况
head = head+1;
return head;
}
int t = find_pre(x);//找到 该元素的前一个位置
if(t == -1){
return NOTEXIST;
}
int tmp = right[t]; //删除操作
right[t] = right[tmp];
right[tmp] = -1;
return head;
}
void print_list(int head)//打印 链表
{
int t = head;
while( t != 0){
printf("%d ",data[t]);
t = right[t];
}
}
int main()
{
int n, head;
head = 1;
scanf("%d",&n);
init_linklist(n);
int x;
scanf("%d",&x);
insert(&n, 2, x);
// head = delete_data(head, 5);
print_list(head);
return 0;
}