一、链表的剩下操作
1. listLinkPtr.h
//任意位置删除
int index_del(linkListPtr H, int index);//按位置修改
int index_change(linkListPtr H, int index, DataType e);//按值查找返回地址
linkListPtr node_addr(linkListPtr H, DataType e);//反转
//int node_rever(linkListPtr H);//销毁
void my_free(linkListPtr H);
2. listLinkPtr.c
//------------------------------------------------------------------
//任意位置删除
int index_del(linkListPtr H, int index)
{//判断所接受的链表是否合法//判空//判断删除位置是否合法if(NULL== H || empty(H) || index<1 || index>H->len){printf("删除失败!\n");return 0;}//定义一个指针指向删除位置的前一个节点linkListPtr q = H;for(int i=0; i<index-1; i++){q=q->next;}//删除 linkListPtr p = q->next;q->next=q->next->next;free(p);p=NULL;//删除成功,链表长度自减H->len--;return 1;
}//按位置修改
int index_change(linkListPtr H, int index, DataType e)
{//判断所接受的链表是否合法//判空//判断删除位置是否合法if(NULL== H || empty(H) || index<1 || index>H->len){printf("修改失败!\n");return 0;}//定义一个指针指向要修改位置的节点linkListPtr p = H;for(int i=0; i<index; i++){p=p->next;}//修改数据p->data=e;return 1;
}//按值查找返回地址
linkListPtr node_addr(linkListPtr H, DataType e)
{//判断所接受的链表是否合法//判空if(NULL== H || empty(H)){printf("查询失败!\n");return 0;}//定义一个指针指向要查询的值的节点位置linkListPtr p = H;for(int i=0; i<H->len; i++){p = p->next;if(p->data == e){return p->next;}}printf("无此数据!\n");return NULL;/*//for循环以外的另一种方法while(p->next != NULL){p = p->next;if(p->data == e){return p->next;}}printf("无此数据!\n");return NULL;
*/}/*
//反转
int node_rever(linkListPtr H)
{//判断所接受的链表是否合法//判空if(NULL== H || empty(H)){printf("查询失败!\n");return 0;}//
}
*///销毁
void my_free(linkListPtr H)
{//判断所接受的链表是否合法if(NULL == H){printf("销毁失败!\n");return;}linkListPtr p = H;for(int i=0; i<H->len; i++){ p = H;for(int j=0; j<H->len-i-1; j++){p = p->next;}free(p->next);p=NULL;}free(H);H=NULL;p=NULL;printf("销毁成功!\n");
}
3. main.c
printf("-----------------------\n");//任意位置删除index_del(H, 3);show(H);//按位置修改index_change(H, 3, 99);show(H);//按值查找返回地址linkListPtr p = node_addr(H, 99);printf("%p\n", p);//反转//node_rever(H);//show(H);//销毁my_free(H);H=NULL;return 0;
4. 执行结果
二、链表知识点思维导图