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");
}

}
}
展开
 我来答
瑞候端瓜0Y
2017-07-07 · TA获得超过2039个赞
知道小有建树答主
回答量:323
采纳率:100%
帮助的人:95.4万
展开全部
测试结果:

录入数据完成.

链表里的数据:
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;
}
zhang20113015
2017-07-07 · 超过27用户采纳过TA的回答
知道答主
回答量:71
采纳率:0%
帮助的人:33.5万
展开全部
链表的中间节点删除后,要更改前几个节点的链接地址,将这个地址链接到删除节点的后面一个节点,这样才能保留链表的完整性。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式