c语言链表删除节点函数,c语言链表的删除操作

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 main()

{

int a = 10,*p = a;

changePtr(p);

}

上面的两个代码我也没测!就是举个例子!

看下面的代码!就是你这个链表的!或者直接打开下面网址(包含下面代码输出结果)

#define size 5

#define del1 "one"

#define del5 "five"

#define del "none"

#define del3 "three"

typedef struct VIDEO {

char name[20];

struct VIDEO *next;

} video;

/*video *head;*/

void build(video**head) {

int i = 0;

video *temp;

char *ss[5] = {"one","two","three","four","five"};

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 1;

} else {

return 0;

}

}

void show(video *head) {

if(head) {

printf("%s",head-name);

while(head-next) {

head = head-next;

printf("-%s",head-name);

}

printf("\n");

}

}

int main()

{

video *head;

build(head);

show(head);

delete(head,del1);

show(head);

delete(head,del5);

show(head);

delete(head,del);

show(head);

delete(head,del3);

show(head);

return 0;

}

输出结果为:

one-two-three-four-five

two-three-four-five

two-three-four

two-three-four

two-four

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

代码如下:

#include stdio.h

#include stdlib.h

typedef struct List

{

int a;

List* next;

}list;

void newList(list* l)//创建结点

{

list* a[4];

for (int i = 0; i 4; i++)

{

a[i] = (list*)malloc(sizeof(list));

a[i]-a = i+1 ;

}

l-next = a[0];

a[0]-next = a[1];

a[1]-next = a[2];

a[2]-next = a[3];

a[3]-next = NULL;

}

void printfList(list* l)//打印结点的数据内容

{

printf("该链表的内容是:\n");

while (l-next)

{

printf("%d\t", l-next-a);

l = l-next;

}

printf("\n");

}

void setList(list* l,int x,int y)

{

list* head = l;

l = l-next;

while (l)

{

if (l-a =y || l-a =x)//将结点的数据区与指定区域进行比较

{

head-next = l;//将满足条件的结点连接在新表的最后一个结点

//指针后移

l = l-next;

head = head-next;

}

else

{

//不满足的结点进行删除

list* l1 = l;

l = l-next;

free(l1);

}

}

head-next = NULL;

}

int main()

{

list* l = (list*)malloc(sizeof(List));

newList(l);//初始化链表

printfList(l);//输出旧表内容

setList(l,1,3);//进行修改

printfList(l);//输出修改后的链表

//system("pause");

return 0;

}

扩展资料

链表的特点

1、插入、删除数据效率高,时间复杂度为O(1)级别(只需更改指针指向即可),随机访问效率低,时间复杂度O(n)级别(需要从链头至链尾进行遍历)。

2、和数组相比,内存空间消耗更大,因为每个存储数据的节点都需要额外的空间存储后继指针。

常用的链表类型

1、单链表

1)每个节点只包含一个指针,即后继指针。

2)单链表有两个特殊的节点,即首节点和尾节点。用首节点地址表示整条链表,尾节点的后继指针指向空地址null。

3)性能特点:插入和删除节点的时间复杂度为O(1),查找的时间复杂度为O(n)。

2、循环链表

1)除了尾节点的后继指针指向首节点的地址外均与单链表一致。

2)适用于存储有循环特点的数据,比如约瑟夫问题。

3、双向链表

1)节点除了存储数据外,还有两个指针分别指向前一个节点地址(前驱指针prev)和下一个节点地址(后继指针next)。

2)首节点的前驱指针prev和尾节点的后继指针均指向空地址。

C语言删除链表节点(程序有删减)

void del(Student *p1,Student *p2)是不是得加个num的输入

void del(Student *p1,Student *p2,int num)

或者下面改成p1-num!=p2-num?

没细看


分享名称:c语言链表删除节点函数,c语言链表的删除操作
本文链接:http://azwzsj.com/article/hshoeh.html