十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
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;
}
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语言的函数里面传入了一个值,是的它是一个值,你看到的你传了一个指针进去,其实这个指针本身也是一个值,链表的头结点是个指针,你要改变这个指针就要用指针的指针才能改变,指针变量也是一个变量,你传入一个指针他也只是在函数的作用域里面过了一份拷贝!看程序!
/*你想改变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