简单数据结构之链式表(C实现)

/*
 ============================================================================
 Name        : Node.c
 Author      : ntsk13 [email protected]
 Version     :
 Copyright   : GPL
 Description : Link list study, complement by C
 Date        : 2015.06.15
 ============================================================================
 */

#include <stdio.h>
#include <stdlib.h>

typedef struct {
	int data;
}Elem_t;

typedef struct lnode{
	Elem_t e;
	struct lnode * next;
}node,*pnode;

void link_init(pnode * L);
void link_clear(pnode *L);


int link_get_length(pnode *L);
Elem_t link_get_elem(pnode *L,int i);

void link_traverse(pnode *L);

void link_insert(pnode *L,Elem_t e,int i);
void link_delete(pnode *L,int i);



int main(void) {
	pnode H=NULL;//head p
	Elem_t zero,one,two,three,four,five;
	zero.data=0;
	one.data=1;
	two.data=2;
	three.data=3;
	four.data=4;

	link_init(&H);
	link_insert(&H,zero,0);
	link_insert(&H,one,1);
	link_insert(&H,two,2);
	link_insert(&H,three,3);
	link_insert(&H,four,4);

	link_traverse(&H);
	printf("len is %d \n", link_get_length(&H) );
	five=link_get_elem(&H,4);
	printf("=================================\n");
	printf("five is %d \n",five.data );
	link_delete(&H,4);
	printf("=================================\n");
	link_traverse(&H);
	printf("len is %d \n", link_get_length(&H) );

	return EXIT_SUCCESS;
}

void link_init(pnode * L)
{
	*L=(node *)malloc(sizeof(Elem_t));//构造一个头结点

	((*L)->e).data =0;//头结点的data作为长度
	(*L)->next=NULL;

}
void link_clear(pnode *L)
{
	int i=0;
	pnode p=*L;
	pnode tmp=NULL;
	int len=( (*L)->e).data;
	for(i=0;i<len;i++)
	{
		tmp=p->next;
		free(p);
		p=tmp;
	}
	*L=NULL;

}

int link_get_length(pnode *L)
{
	return ( (*L)->e).data;;
}
Elem_t link_get_elem(pnode *L,int i)
{
	int j=0;
	pnode p=(*L)->next;
	while(j <i )
	{
		j++;
		p=p->next;
	}
	return p->e;
}

void link_traverse(pnode *L)
{
	int i=0;
	pnode p=(*L)->next;//避免把头指针元素输出
	int len=( (*L)->e).data;
	for(i=0;i< len;i++)
	{
		printf("The %dth elem is %d\n",i,(p->e).data);
		p=p->next;
	}
}

void link_insert(pnode *L,Elem_t e,int i)// before i insert
{
	int j=0;
	pnode p=*L;
	pnode tmp=NULL;
	for(j=0;j< i;j++)
	{
		p=p->next;
	}
	tmp=(node *)malloc(sizeof(Elem_t));
	(tmp->e).data=e.data;

	tmp->next=p->next;
	p->next=tmp;
	( (*L)->e).data++;

}
void link_delete(pnode *L,int i)
{
	int j=0;
	pnode p=(*L)->next;
	pnode tmp=NULL;
	for(j=0;j< i-1;j++)
	{
		p=p->next;
	}
	tmp=p;
	p->next=p->next->next;
	( (*L)->e).data--;
	free(tmp->next);
}


你可能感兴趣的:(简单数据结构之链式表(C实现))