c语言单链表删除节点有什么问题吗,删不了啊,只是要删除的跑到后面了而已,要第二次执行才会删除
char*bname;charchoose;structbookin*elem=head;//用于索引的指针structbookin*temp=NULL;//用于记录删除...
char *bname;
char choose;
struct bookin *elem = head;//用于索引的指针
struct bookin *temp = NULL;//用于记录删除结点的上一个结点
FILE *fp;
printf("请输入要删除的图书书名:");
fflush(stdin);
gets(bname);
if(strcmp(elem->bname,bname) == 0)
{
head = elem->next;
free(elem);
}
else
{
while (elem != NULL)//没有到尽头
{
temp = elem;//记录保存好
elem = elem->next;//往后索引
if (elem == NULL)//遍历完也没找到
{
printf("没有找到要删除的结点\n");
}
else if(strcmp(elem->bname,bname) == 0)//找到
{
temp->next = elem->next;//删除结点的前一个结点指向删除结点的后一个结点
free(elem);//释放删除结点的内存
F_write();
break;
}
else
{
printf("没有找到要删除的结点\n");
}
}
} 展开
char choose;
struct bookin *elem = head;//用于索引的指针
struct bookin *temp = NULL;//用于记录删除结点的上一个结点
FILE *fp;
printf("请输入要删除的图书书名:");
fflush(stdin);
gets(bname);
if(strcmp(elem->bname,bname) == 0)
{
head = elem->next;
free(elem);
}
else
{
while (elem != NULL)//没有到尽头
{
temp = elem;//记录保存好
elem = elem->next;//往后索引
if (elem == NULL)//遍历完也没找到
{
printf("没有找到要删除的结点\n");
}
else if(strcmp(elem->bname,bname) == 0)//找到
{
temp->next = elem->next;//删除结点的前一个结点指向删除结点的后一个结点
free(elem);//释放删除结点的内存
F_write();
break;
}
else
{
printf("没有找到要删除的结点\n");
}
}
} 展开
2个回答
展开全部
测试结果:
录入数据完成.
链表里的数据:
1001 abc 123
1002 defg 4567
1003 hi 89
请输入要删除的图书书名:abc
链表里的数据:
1002 defg 4567
1003 hi 89
//以下代码,将链表头head设置为全局变量
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct bookin
{
int id;
char bname[30];
int data;
struct bookin *next;
};
struct bookin *head=NULL; //链表头(不带头结点)
//创建链表
void CreateLink()
{
struct bookin *p; //当前结点
struct bookin *newNode; //新结点
newNode=(struct bookin*)malloc(sizeof(struct bookin));
newNode->id=1001;
strcpy(newNode->bname,"abc");
newNode->data=123;
newNode->next=NULL;
head=newNode; //链表头指向第一个结点
p=head;
newNode=(struct bookin*)malloc(sizeof(struct bookin));
newNode->id=1002;
strcpy(newNode->bname,"defg");
newNode->data=4567;
newNode->next=NULL;
p->next=newNode;
p=newNode;
newNode=(struct bookin*)malloc(sizeof(struct bookin));
newNode->id=1003;
strcpy(newNode->bname,"hi");
newNode->data=89;
newNode->next=NULL;
p->next=newNode;
p=newNode;
printf("录入数据完成.\n");
}
//打印链表
void PrintLink()
{
struct bookin *p;
if(head==NULL)
{
printf("\n链表里没有数据\n");
}
p=head;
while(p!=NULL)
{
printf("%-10d",p->id);
printf("%-10s",p->bname);
printf("%d",p->data);
printf("\n");
p=p->next;
}
printf("\n");
}
//删除结点
void deleteNode()
{
//char *bname;
char bname[30]; //bname必须分配了内存,才能存放字符串
//原代码char choose;
struct bookin *elem = head;//用于索引的指针
struct bookin *temp = NULL;//用于记录删除结点的上一个结点
//原代码FILE *fp;
printf("请输入要删除的图书书名:");
fflush(stdin);
gets(bname);
if(strcmp(elem->bname,bname) == 0)
{
head = elem->next;
free(elem);
}
else
{
while (elem != NULL)//没有到尽头
{
temp = elem;//记录保存好
elem = elem->next;//往后索引
if (elem == NULL)//遍历完也没找到
{
printf("没有找到要删除的结点\n");
break; //增加这个语句,跳出while循环
}
else if(strcmp(elem->bname,bname) == 0)//找到
{
temp->next = elem->next;//删除结点的前一个结点指向删除结点的后一个结点
free(elem);//释放删除结点的内存
//原代码F_write();
break;
}
//原代码
//else
//{
// printf("没有找到要删除的结点\n");
//}
}
}
}
int main(void)
{
//创建链表
CreateLink();
printf("\n链表里的数据:\n");
PrintLink(head);
//删除结点
deleteNode();
printf("\n链表里的数据:\n");
PrintLink(head);
return 0;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询