注册 登录
编程论坛 C++教室

链表问题求助!!!

a632034079 发布于 2010-08-12 11:22, 583 次点击
斑竹求助啊!!!编译通过了但是有个逻辑错误,这个链表一输入进去就出错,我不会跟代码,请斑竹们,高手们帮帮我看看………………
可以的话说怎么跟代码………………

-----------main.cpp文件------------------
#include <stdio.h>
#include <string.h>
#include "tou.h"

void lianbiaobl(lianbiao *head)              //遍历链表
{
    lianbiao *h;
    h=head;
    DATA data;
    printf("ShuJu RuXia!\n");
    while(h)
    {
        data=h->data;
        printf("(%s,%s,%d)\n",data.key,data.name,data.age);
        h=h->next;
    }
}

int main()
{
    lianbiao *node,*head=NULL;
    DATA data;
    char key[15],findkey[15];

    printf("Qing ShuRu : KEY  NAME  AGE\n");

    while(1)         //添加结点
    {
        scanf("%s",data.key);
        if(strcmp(data.key,"0")==0) break;

        scanf("%s%d",data.name,data.age);
        head=lianbiaotjw(head,data);
    }

    printf("Gai LianBiao De JieDian Shu : %d\n",lianbiaojds(head));

    lianbiaobl(head);   //遍历输出

    printf("\nChaRu JieDian : ");
    scanf("%s",&findkey);
    printf("ShuRu JieDian ShuJu!!!\n");
    scanf("%s%s%d",data.key,data.name,data.age);

    head=lianbiaocr(head,findkey,data);  //插入到指定位置

    lianbiaobl(head);  //遍历输出

    printf("\nZai LianBiao Zhong ChaZhao : ");
    scanf("%s",key);
    node=lianbiaogjcz(head,key);  //关键字查找

    if(node)
    {
        data=node->data;
        printf("GuanJianZi %s DueiYing De ShuJuWei (%s,%s,%d)\n",key,data.key,data.name,data.age);  //输出关键字查找到的元素
    }
    else
    {
        printf("Zai LianBiao Zhong WeiZhaoDao!");
    }

    printf("\nZai LianBiaoZhong ShanChu JieDian!");
    scanf("%s",key);
    lianbiaosc(head,key);  //删除关键字的元素

    lianbiaobl(head);    //遍历输出

    return 0;
}

-----------------tou.h文件------------------------------
#include <stdio.h>

typedef struct
{
    char key[15];
    char name[20];
    int age;
}DATA;

typedef struct Node
{
    DATA data;
    struct Node *next;
}lianbiao;

lianbiao *lianbiaotjw(lianbiao *head,DATA data);    //在尾部添加

lianbiao *lianbiaotjt(lianbiao *head,DATA data);     // 在头部添加

lianbiao *lianbiaogjcz(lianbiao *head,char *key);  //关键字查找

lianbiao *lianbiaocr(lianbiao *head,char *findkey,DATA data);   //在指定位置插入

int lianbiaosc(lianbiao *head,char *key);   //删除操作

int lianbiaojds(lianbiao *head);   //求链表结点数

---------------------------------hanshuti.cpp文件---------------------------------------
#include <iostream>
#include "tou.h"
#include <string.h>
using namespace std;

lianbiao *lianbiaotjw(lianbiao *head,DATA data)           //在尾部添加
{
    lianbiao *node,*h;
    if(!(node=(lianbiao *)malloc(sizeof(lianbiao))))
    {
        printf("ShenQing ShiBai !!!");
        return NULL;
    }
    node->data = data;
    node->next = NULL;

    if(head==NULL)
    {
        head=node;
        return head;
    }
    h=head;
    while(h->next!=NULL)
        h=h->next;

    h->next=node;
    return head;
}

lianbiao *lianbiaotjt(lianbiao *head,DATA data)          // 在头部添加
{
    lianbiao *node;
    if(!(node=(lianbiao *)malloc(sizeof(lianbiao))))
    {
        printf("ShenQing ShiBai !!!");
        return NULL;
    }

    node->data=data;
    node->next=head;

    head = node;
    return head;
}

lianbiao *lianbiaocr(lianbiao *head,char *findkey,DATA data)      //在指定位置插入
{
    lianbiao *node,*node1;
    if(!(node=(lianbiao *)malloc(sizeof(lianbiao))))
    {
        printf("ShenQing ShiBai !!!");
        return 0;
    }
    node->data=data;

    node1=lianbiaogjcz(head,findkey);
    if(node1)
    {
        node->next=node1->next;
        node1->next=node;
    }
    else
    {
        printf("JieDian WeiZhaoDao !");
        free(node);
    }

    return head;
}

lianbiao *lianbiaogjcz(lianbiao *head,char *key)      //关键字查找
{
    lianbiao *h;
    h=head;
    while(h)
    {
        if(strcmp(h->data.key,key)==0)
            return h;
        h=h->next;
    }

    return NULL;
}

int lianbiaosc(lianbiao *head,char *key)   //删除操作
{
    lianbiao *node,*h;
    node=h=head;
    while(h)
    {
        if(strcmp(h->data.key,key)==0)
        {
            node->next=h->next;
            free(h);
            return 1;
        }
        else
        {
            node=h;
            h=h->next;
        }
    }
    return 0;
}

int lianbiaojds(lianbiao *head)    //求链表结点数
{
    lianbiao *h;
    h=head;
    int i=0;
    while(h)
    {
        i++;
        h=h->next;
    }

    return i;
}

[ 本帖最后由 a632034079 于 2010-8-13 09:02 编辑 ]
7 回复
#2
东海一鱼2010-08-12 11:54
  printf("Qing ShuRu : KEY  NAME  AGE\n");

    while(1)
    {
        scanf("%s",data.key);
        if(strcmp(data.key,"0")==0) break;

        scanf("%s%d",data.name,data.age);   //&data.age
        head=lianbiaotjw(head,data);
    }

#3
a6320340792010-08-12 12:59
以下是引用东海一鱼在2010-8-12 11:54:45的发言:

  printf("Qing ShuRu : KEY  NAME  AGE\n");

    while(1)
    {
        scanf("%s",data.key);
        if(strcmp(data.key,"0")==0) break;

        scanf("%s%d",data.name,data.age);   //&data.age
        head=lianbiaotjw(head,data);
    }

e错的怎么水
#4
pangding2010-08-12 16:22
这种错误,有的编译器会给警告的。
#5
a6320340792010-08-12 19:56
以下是引用pangding在2010-8-12 16:22:39的发言:

这种错误,有的编译器会给警告的。

我改了 还是不行………………
#6
pangding2010-08-12 23:49
你给每个函数头写点注释吧,要不然看名都不知道是什么东西。
比如 lianbiaobl 的 bl 是什么缩写?根据功能猜,好像是“遍历”?总之函数名起的糟一些,就用注释补一下。
还有你有没有怀疑哪个函数错误的可能性更大什么的?总之这种长代码,你自己多给点信息,我们发现问题花的精力就有更少一些,回答的一般也会更有针对性。
#7
a6320340792010-08-13 09:03
以下是引用pangding在2010-8-12 23:49:22的发言:

你给每个函数头写点注释吧,要不然看名都不知道是什么东西。
比如 lianbiaobl 的 bl 是什么缩写?根据功能猜,好像是“遍历”?总之函数名起的糟一些,就用注释补一下。
还有你有没有怀疑哪个函数错误的可能性更大什么的?总之这种长代码,你自己多给点信息,我们发现问题花的精力就有更少一些,回答的一般也会更有针对性。

,太懒了,都忘了注释,你看下可以不…………
#8
pangding2010-08-13 13:47
不知道你的 key 是什么意思。你只在 main 函数里用了一下吧?实际插入的时候,都没有要求提供 key 呀?好像程序也不能自己算出来。

运行时不正常的表现是什么?死循环还是会非正常退出?在执行到什么地方出的问题?你自己先分析分析。
1