c语言函数删除链表结点 C语言链表的删除

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语言中删除链表中的一个节点

temp=p;

p=p-next;

temp-next=NULL;

这三句存在问题,temp=p,让temp指向p所指向的节点,p=p-next,p指向后移

temp-next=NULL,让temp的后继为空,这里出了问题,链表从temp指向的节点断开,相当于删除p之后的所有节点。

应该先判断p是不是最后节点

if(p-next==NULL)

如果是,只好去找p的前趋pre,让pre-next=NULL,free(p)

如果不是最后节点,将p的后继节点数值域复制给p,然后将p的后继节点删除,等同与删除p

p-data=p-next-data;

p-next=p-next-next;

free(p);

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语言函数删除链表结点 C语言链表的删除
文章网址:https://www.cdcxhl.com/article4/doogpoe.html

成都网站建设公司_创新互联,为您提供网站排名响应式网站企业建站面包屑导航营销型网站建设用户体验

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

绵阳服务器托管