用数组模拟链表操作 C实现~

来源:互联网 发布:java中循环遍历数组 编辑:程序博客网 时间:2024/06/07 20:50

用data数组存储数据, 为了 方便 从下表为1开始存储。

用数组right存储当前序列每一元素的的下一位置的索引。

#include<stdio.h>#define NOTEXIST -1int 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;//初始数据的索引} elseright[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;}elsereturn 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;} 

原创粉丝点击