网站首页 > 文章中心 > 其它

c语言链表删除节点函数

作者:小编 更新时间:2023-09-29 10:28:21 浏览量:480人看过

C语言中链表怎么删除结点

有分才有动力啊哥们.

删除节点很简单,以单链表为例,牢记三点

避免断链,删除掉节点后,前一个节点的p-next一定要指向后一个节点(如果是头节点,记得要将新表头P指向到原来的第二个节点.如果是尾节点,记得要将新的尾节点p-next置为NULL,).

避免野指针,删除掉节点后,p-next=NULL;

避免内存泄漏,删除的节点,要用free释放堆内存.

如果是双向链表,不过是多了一个对prev操作,道理是一样的.

C语言关于链表删除某个节点的问题,不知道写法,麻烦指点

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语言呢,就是看不出来这个问题,其实问题很简单,就是你在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

数据结构(C语言版)中的删除链表中的一个节点

代码如下:

#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语言删除链表节点(程序有删减)

没细看

以上就是土嘎嘎小编为大家整理的c语言链表删除节点函数相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章