有分才有动力啊哥们.
删除节点很简单,以单链表为例,牢记三点
避免断链,删除掉节点后,前一个节点的p-next一定要指向后一个节点(如果是头节点,记得要将新表头P指向到原来的第二个节点.如果是尾节点,记得要将新的尾节点p-next置为NULL,).
避免野指针,删除掉节点后,p-next=NULL;
避免内存泄漏,删除的节点,要用free释放堆内存.
如果是双向链表,不过是多了一个对prev操作,道理是一样的.
struct?node?*delete(struct?node*?head)//删除函数
{
printf("请输入要删除的学生姓名");
char?k[100];
scanf("%s",?k);
struct?node?*pre?=?NULL;
struct?node?*q?=?head;
while?(q)?{
if?(strcmp(q-data.name,?k)?==?0){
if?(pre)
pre-next?=?q-next;
else?
head?=?q-next;
free(q);
break;
}
pre?=?q;
q?=?q-next;
return?head;
刚学C语言呢,就是看不出来这个问题,其实问题很简单,就是你在C语言的函数里面传入了一个值,是的它是一个值,你看到的你传了一个指针进去,其实这个指针本身也是一个值,链表的头结点是个指针,你要改变这个指针就要用指针的指针才能改变,指针变量也是一个变量,你传入一个指针他也只是在函数的作用域里面过了一份拷贝!看程序!
/*你想改变a的值,所以你传了一个指针进去*/
void?change(int?*a)
*a?=?10;
int?main()
int?a?=?0;
change(a);
这里要说的是其实,指针也是一个变量;所以你想改变一个指针的值,同样的你也要把这个指针的地址传进去,就是指针的指针了,看代码!
void?changePtr(int*?*a)
*a?=?(int*)malloc(sizeof(int));
int?a?=?10,*p?=?a;
changePtr(p);
上面的两个代码我也没测!就是举个例子!
看下面的代码!就是你这个链表的!或者直接打开下面网址(包含下面代码输出结果)
#define?del1?"one"
#define?del?"none"
typedef?struct?VIDEO?{
struct?VIDEO?*next;
}?video;
/*video?*head;*/
void?build(video**head)?{
int?i?=?0;
video?*temp;
temp?=?*head?=?NULL;
for(i?=?0;i?size;i++)?{
if(*head)?{
temp-next?=?(video*)malloc(sizeof(video));
temp?=?temp-next;
/*scanf("%s",temp-name);*/
strcpy(temp-name,ss[i]);
temp-next?=?NULL;
}?else?{
*head?=?(video*)malloc(sizeof(video));
/*scanf("%s",head-name);*/
strcpy((*head)-name,ss[i]);
(*head)-next?=?NULL;
temp?=?*head;
int?delete(video**head,char?*str)?{
video?*cur,*prv?=?*head;
if(*head?==?NULL)?return?0;
if(strcmp((*head)-name,str)?==?0)?{
*head?=?(*head)-next;
free(prv);
return?1;
cur?=?prv-next;
while(cur?strcmp(cur,str))?{
cur?=?cur-next;
prv?=?prv-next;
if(cur)?{
prv-next?=?cur-next;
free(cur);
return?0;
void?show(video?*head)?{
if(head)?{
printf("%s",head-name);
while(head-next)?{
head?=?head-next;
printf("-%s",head-name);
printf("\n");
video?*head;
build(head);
show(head);
delete(head,del1);
delete(head,del);
输出结果为:
one-two-three-four-five
two-three-four-five
two-three-four
two-four
代码如下:
#include stdio.h
#include stdlib.h
typedef struct List
int a;
List* next;
}list;
void newList(list* l)//创建结点
a[i] = (list*)malloc(sizeof(list));
a[i]-a = i+1 ;
l-next = a[0];
a[0]-next = a[1];
void printfList(list* l)//打印结点的数据内容
printf("该链表的内容是:\n");
while (l-next)
printf("%d\t", l-next-a);
l = l-next;
void setList(list* l,int x,int y)
list* head = l;
while (l)
if (l-a =y || l-a =x)//将结点的数据区与指定区域进行比较
head-next = l;//将满足条件的结点连接在新表的最后一个结点
//指针后移
head = head-next;
else
//不满足的结点进行删除
list* l1 = l;
free(l1);
head-next = NULL;
int main()
list* l = (list*)malloc(sizeof(List));
newList(l);//初始化链表
printfList(l);//输出旧表内容
printfList(l);//输出修改后的链表
//system("pause");
return 0;
扩展资料
链表的特点
①.、插入、删除数据效率高,时间复杂度为O(1)级别(只需更改指针指向即可),随机访问效率低,时间复杂度O(n)级别(需要从链头至链尾进行遍历).
常用的链表类型
①.、单链表
①.)每个节点只包含一个指针,即后继指针.
①.)除了尾节点的后继指针指向首节点的地址外均与单链表一致.
①.)节点除了存储数据外,还有两个指针分别指向前一个节点地址(前驱指针prev)和下一个节点地址(后继指针next).
没细看
以上就是土嘎嘎小编为大家整理的c语言链表删除节点函数相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!