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语言链表的删除
地址分享:http://pwwzsj.com/article/doogpoe.html