删除元素的函数要用到二级指针,如果对二级指针不熟悉,可以不使用remove_elem函数,在主函数中把remove_elem注释起来,然后将main函数中的代码的注释去掉即可,效果是一样的。
程序如下所示:
#include <stdio.h>
#include <stdlib.h>
typedef int DataType;
struct LinkList
{
DataType elem;
struct LinkList *next;
};
//根据数据的内容创建链表,然后返回链表的首元素指针
struct LinkList *CreateList(DataType arr[],int len)
{
int i = 0;
struct LinkList *ptr = NULL;
struct LinkList *pHead = NULL;
//初始化第一个结点
pHead = (struct LinkList*)calloc(1,sizeof(struct LinkList));
ptr = pHead;
ptr->elem = arr[0];
for( i = 1 ; i < len ; i++ )
{
ptr->next = (struct LinkList*)calloc(1,sizeof(struct LinkList));
ptr = ptr->next;
ptr->elem = arr[i];
}
return pHead;
}
//删除元素e
void remove_elem(struct LinkList **pList,DataType e)
{
struct LinkList *p1 = *pList;
struct LinkList *p2 = NULL;
//如果删除的是第一个结点
if((*pList)->elem == e)
{
*pList = (*pList)->next;
free(p1);
return ;//删除了第一个节点,下一个节点为头结点
}
//只要删除的不是第一个,都是修改前驱链域
p2 = p1->next;
while(p2)
{
if(p2->elem == e)
{
p1->next = p2->next;
free(p2);
return ;
}
p1 = p2;//p1是前驱
p2 = p2->next;//p2是后继
}
}
//输出数据
void print_elem(struct LinkList *pList)
{
while(pList)
{
printf("%d ",pList->elem);
pList = pList->next;
}
putchar('\n');
}
//释放资源
void free_list(struct LinkList *pList)
{
struct LinkList *p = pList->next;
while(pList)
{
free (pList);
pList = p;
p = p->next;
}
}
int main(int argc, char* argv[])
{
struct LinkList *pList = NULL;
struct LinkList *p1 = NULL;
struct LinkList *p2 = NULL;
DataType arr[]={1,2,3,4,5,6,7,8,9,10};
//创建链表
pList = CreateList(arr,10);
//删除元素
remove_elem(&pList,5);
/*
p1 = pList;
//如果删除的是头结点
if(pList->elem == 5)
{
pList = pList->next;
free(p1);
}
//删除的不是头结点
p2 = pList->next;
while(p2)
{
if(p2->elem == 5)
{
p1->next = p2->next;
free (p2);
break;
}
p1 = p2;
p2 = p2->next;
}
*/
//输出表的数据
print_elem(pList);
return 0;
}
运行结果:
有什么不懂得欢迎提问。