| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 483 人关注过本帖
标题:关于向链表中添加一个节点,出现错误 求解惑
只看楼主 加入收藏
那小扎
Rank: 1
来 自:长沙
等 级:新手上路
帖 子:21
专家分:9
注 册:2013-6-12
结帖率:100%
收藏
 问题点数:0 回复次数:3 
关于向链表中添加一个节点,出现错误 求解惑
在写一个关于链表的程序,在向其中添加一个节点出现错误,下面是相关代码,至于其它关于删除和遍历的代码省略,拜托大家发现问题;
程序代码:
/*头文件,    list.h*/
#ifndef _LIST_H_
#define _LIST_H_


#define MAXSIZE 30
struct classmate
{
    char name[MAXSIZE];
    char sex[MAXSIZE];
    int age;
};
typedef struct classmate Item;

typedef struct node
{
    Item item;
    struct node *next;
}Node;

typedef  struct list
{
    Node *head;
    int size;
}List;

typedef struct pair
{
    Node * previous;
    Node * current;
}Pair;

void InitializeList(List * plist);
int ListIsEmpty(const List *plist);

int AddItem(const Item *pitem1,const Item *pitem2,List * plist);
#endif // _LIST_H_

程序代码:
/*实现头文件功能,list.cpp*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "list.h"

static Pair SeekItem(const Item *pitem,const List *list);
static Node * MakeNode(const Item *pitem);

void InitializeList(List *plist)
{
    plist->head=NULL;
    plist->size=0;
}

int ListIsEmpty (const List * plist)
{
    if(plist->head==NULL)
           return 1;
    else
           return 0;
}


int AddItem(const Item * pitem1,const Item *pitem2,List *plist)
{
    Node * new_node;
    Node * flag;
    Node * temp;
    flag=plist->head;

    if(SeekItem(pitem1,plist).current!=NULL)
    {
        printf("the item has been exist.\n");
        return 0;
    }
    new_node=MakeNode(pitem1);
    if(new_node==NULL)
    {
        printf("failed to creat a new node.\n");
        return 0;
    }
    plist->size++;
    if(plist->head==NULL)
        plist->head=new_node;
    else if(pitem2->name==NULL)
    {
        while(flag->next!=NULL)
            flag=flag->next;
        flag->next=new_node;
    }
    else
    {
        temp=SeekItem(pitem2,plist).previous;
        new_node->next=temp->next;
        temp->next=new_node;
    }
    return 1;
}


static Node * MakeNode(const Item *pitem)
{
    Node * new_node;

    new_node=(Node *)malloc(sizeof(Node));
    if(new_node!=NULL)
    {
        new_node->item=*pitem;
        new_node->next=NULL;
    }
    return new_node;
}

static Pair SeekItem(const Item *pitem,const List *plist)
{
    Pair temp;

    temp.previous=NULL;
    temp.current=plist->head;
    while(strcmp(pitem->name,temp.current->item.name)==0||temp.current==NULL)
    {
        temp.previous=temp.current;
        temp.current=temp.current->next;

    }
    return temp;
}

程序代码:
/*测试函数,,,listtest.cpp*/
#include <stdio.h>
#include <stdlib.h>

#include "list.h"

void AddOne (List *plist);

int main(void)
{
    List classmates;
;   InitializeList(&classmates);

    AddOne(&classmates);    
    puts("good job\n");
    return 0;
}


void AddOne(List *plist)
{
        Item temp,temp1;

        puts("please enter your classmate\'s name:\n");
        gets(temp.name);
        puts("please enter sex of your classmate:\n");
        gets(temp.sex);
        puts("please enter age of your classmate:\n");
        scanf("%d",&temp.age);
        printf("请输入你所希望将该项目添加的位置之前项目的名字:(输入空行自动添加到链表结尾)。\n");
        gets(temp1.name);
        AddItem(&temp,&temp1,plist);
}

2013-06-17 17:44
那小扎
Rank: 1
来 自:长沙
等 级:新手上路
帖 子:21
专家分:9
注 册:2013-6-12
收藏
得分:0 
.....

    将编写玩具式程序的趣味性与为实现功能而进行开发的艰难性区分开来!!
2013-06-22 08:57
NBABOY
Rank: 4
等 级:业余侠客
威 望:4
帖 子:129
专家分:281
注 册:2013-5-2
收藏
得分:0 
怎么这么复杂呢?一个链表而已,都把我绕晕了,用不着搞那麽多的结构,那麽多函数,应该是逻辑结构体错误,或是语法错误,建议你简化结构,把需要的数据像name ,mex,age,size,等等放一个结构里,插入删除只需改变结点方向即可
收到的鲜花
  • 那小扎2013-06-24 12:06 送鲜花  3朵   附言:我很赞同
2013-06-22 12:33
那小扎
Rank: 1
来 自:长沙
等 级:新手上路
帖 子:21
专家分:9
注 册:2013-6-12
收藏
得分:0 
回复 3楼 NBABOY
这也叫复杂,- -,只是自定义并实现一个ADT而已,问题已解决,谢谢你了。

    将编写玩具式程序的趣味性与为实现功能而进行开发的艰难性区分开来!!
2013-06-24 07:07
快速回复:关于向链表中添加一个节点,出现错误 求解惑
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019288 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved