C语言--数据结构--单链表的基本实现

typedef int ElementType;

typedef struct LNode{
	ElementType data;
	struct LNode *ptr;
}LNODE,*LINKLIST;



/**
 *@Function: 单链表的建立(包含头结点)
 *@params  : 
 *@return  :
 *@note    : 
 */
LINKLIST LinkList_Creat(void)
{
	LNODE *headPtr;  //头指针 
	LNODE *headNode; //头结点 
	
	headPtr=headNode=(LINKLIST)malloc(sizeof(LNODE));
	if(headPtr == NULL || headNode == NULL){
		printf("创建单链表失败!!!\n");
		return;
	}
	
	headNode->ptr=NULL;
	headNode->data=0; 
	
	//printf("headPtr = %p\n",headPtr);
	//printf("headNode = %p\n",headNode);
	//printf("headNode->ptr = %p\n",headNode->ptr);
	//printf("headNode->data = %d\n",headNode->data);
	
	return headNode;
	
}
/**
 *@Function: 单链表的元素--插入 
 *@params  : 
 *@return  :
 *@note    : 在第pos个位置插入元素,首先需要求出pos的直接前驱;
 *           元素的插入分为在尾部直接插入,在中间插入 
 */
LINKLIST LinkList_Insert(LINKLIST linklist,int pos,ElementType data)
{
	LNODE *temPtr;
	LNODE *s;
	int i=0;
	temPtr = linklist;
	
	if(pos > (temPtr->data) + 1){ 											    //插入位置非法
		printf("插入位置非法!!!\n"); 
		return;
	}
	
	for(i=0;i<pos-1;i++){                                                       //获取第pos个位置的直接前驱结点 
		temPtr=temPtr->ptr;
	} 
	//printf("temPtr=%p\n",temPtr);
	if(pos == (linklist->data + 1)){                                            //在最后一个结点或者第一结点插入数据,实际相当于尾部直接插入元素 
		s=(LINKLIST)malloc(sizeof(LNODE));
		temPtr->ptr=s;
		s->data = data;
		linklist->data++;                                                       //长度+1,长度信息保存在头结点的数据域 
		s->ptr=NULL;                                                            //没有直接后继,所以最后一个节点的指针域为空 
		//printf("if-malloc_addr=%p\n",s);
	} 
	else{                                                                       //说明有直接后继元素 
		s=(LINKLIST)malloc(sizeof(LNODE));
		s->ptr=temPtr->ptr;
		temPtr->ptr=s;
		s->data=data;
		linklist->data++;                                                       //长度+1,长度信息保存在头结点的数据域  
		//printf("el-malloc_addr=%p\n",s);
	}
	return linklist;	
}

/**
 *@Function: 单链表的元素--删除 
 *@params  : 
 *@return  :
 *@note    : 在第pos个位置删除元素,首先需要求出pos的直接前驱;
 *           元素的删除分为在尾部直接删除,在中间删除 
 */
bool LinkList_Delete(LINKLIST linklist,int pos)
{
	LNODE *tmp; 
	LNODE *tmp1=NULL;
	int i;
	tmp=linklist;
	
	if(pos > linklist->data){
		printf("非法删除!!!\n");
		return;
	}
	for(i=0;i<pos-1;i++){                                                       //获取第pos个位置的直接前驱结点 
		tmp=tmp->ptr;
	} 
	if(pos == linklist->data){
		free(tmp->ptr);
		tmp->ptr=NULL;
		linklist->data--;
	}
	else{
		tmp1=tmp->ptr;
		tmp->ptr=tmp1->ptr;
		linklist->data--;
		free(tmp1);
	}
	return true;
}


/**
 *@Function: 单链表的元素--查询 
 *@params  : 
 *@return  :
 *@note    : 
 *           
 */
ElementType LinkList_Query(LINKLIST linklist,int pos)
{
	LNODE *tmp;
	int i;
	tmp=linklist->ptr;
	
	if(pos > linklist->data){
		printf("非法查询!!!\n"); 
		return;
	}
	
	for(i=1;i<pos;i++){
		tmp=tmp->ptr;	
	}
	printf("--query-data=%d\n",tmp->data);
	printf("--data-addre=%p\n\n",tmp);
	return tmp->data;
	
	 
} 

 
/**
 *@Function: 遍历输出链表元素 
 *@params  : 
 *@return  :
 *@note    : 
 */
void printAllDatas(LINKLIST linklist)
{
	int i=0;
	LNODE *tmep;
	tmep=linklist->ptr;
	printf("/*--------------------------*/\n");
	for(i=0;i<linklist->data;i++){
		
		printf("data[%d]=%d\n",i,tmep->data);
		printf("addr[%d]=%p\n",i,tmep);
		tmep=tmep->ptr;
		printf("/*--------------------------*/\n");
	}
	printf("length=%d\n",linklist->data);	
}

/**
 *@Function: 算法测试 
 *@params  : 
 *@return  :
 *@note    : 
 */
void LinkList_Print2Test(void)
{
	int i;
	LINKLIST linklist;
	linklist=LinkList_Creat(); 
	LinkList_Insert(linklist,1,23);
	LinkList_Insert(linklist,2,25);
	LinkList_Insert(linklist,3,27);
	LinkList_Insert(linklist,2,229);
		LinkList_Insert(linklist,1,213);
		LinkList_Insert(linklist,2,215);
		LinkList_Insert(linklist,3,217);
		LinkList_Insert(linklist,2,219);
	
	for(i=1;i<linklist->data+1;i++){
		LinkList_Query(linklist,i);
	}	
	LinkList_Delete(linklist,8);
	LinkList_Delete(linklist,9);
	LinkList_Delete(linklist,1);
	
	printAllDatas(linklist);
}




猜你喜欢

转载自salmon2016.iteye.com/blog/2351249