静态链表例子

http://blog.csdn.net/ayymbirst/article/details/4430416
#include <stdio.h>
#include <stdlib.h>
typedef struct Elem{
	int data;
	int next;/*指定下一个元素位序*/
}Elem_p;

typedef struct node{
	Elem_p *Elem;
	int length;
	int size;
}NODE;

/*创建静态链表*/
int createList(NODE *L, int size){
	L->Elem = (Elem_p *)malloc(sizeof(Elem_p)*(size + 1));
	if(L->Elem == NULL) 
		return 0;
	L->Elem[0].next = -1;
	L->length = 0;
	L->size = size;
	return 1;
}

/*插入元素*/
int addData(NODE *L, int data){
	int k = 0;
	if(L->size <= L->length)
		return 0;

	 /*升序插入元素*/
	while(L->Elem[L->Elem[k].next].data != -1 && L->Elem[L->Elem[k].next].data < data){
		k = L->Elem[k].next;
	}

	L->Elem[L->length+1].data = data;
	L->Elem[L->length+1].next = L->Elem[k].next;
	L->Elem[k].next = L->length+1;

	(L->length)++;
}

void print(int d){
	printf("/n %d", d);
}

/*遍历链表*/
void foreach(NODE L, void(*t)(int)){
	int k;
	k = L.Elem[0].next;
	while(k!=-1){
		(*t)(L.Elem[k].data);
		k = L.Elem[k].next;
	}
}

/*返回指定位序索引*/
int getElemAt(int index, NODE L, int *pre){
	int p,k = 0;
	if(index < 0 || index > L.length)
		return -4;
	p = 0;
	while(p != -1 && k < index){
		*pre = p;
		p = L.Elem[p].next;
		k++;
	}
	if(p == -1 || k > index)
		return -4;
	return p;
}

/*指定位序插入元素*/
int insertElemAt(NODE *L, int index, int data){
	int p, pre;
	if(L->length >= L->size)
		return 0;
	if(index < 1 || index > L->length+1)
		return 0;

	p = getElemAt(index-1, *L, &pre);
	if(p == -4) return 0;

	/*在 位序 L->Elem[p] 和 L->Elem[L->Elem[p].next] 间插入元素*/
	L->Elem[L->length + 1].data = data;
	L->Elem[L->length + 1].next = L->Elem[p].next;
	L->Elem[p].next = L->length + 1;

	L->length++;
	return 1;
}

/*删除指定位序元素*/
int deleteElemAt(NODE *L, int index){
	int pre, p;
	p = getElemAt(index, *L, &pre);

	if(p == -4||p==0)return 0;

	L->Elem[pre].next = L->Elem[p].next;
	L->length--;
	return 1;
}

void main()
{
	NODE L;
	int k, p;
	//clrscr();
	createList(&L, 7);

	addData(&L, 1);
	addData(&L, 2);
	addData(&L, 3);
	addData(&L, 4);
	addData(&L, 5);
	addData(&L, 10);

	insertElemAt(&L, 3, 1);

	foreach(L, print);
	//free(&L);
}
 原文有一些错误,转贴备用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值