c语言数据结构创建一个node单链表,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

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

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

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;idata;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;idata+1;i++){

LinkList_Query(linklist,i);

}

LinkList_Delete(linklist,8);

LinkList_Delete(linklist,9);

LinkList_Delete(linklist,1);

printAllDatas(linklist);

}

你可能感兴趣的:(c语言数据结构创建一个node单链表,C语言--数据结构--单链表的基本实现)