标题:链表添加错误~~~
只看楼主
a15022606145
Rank: 1
等 级:新手上路
帖 子:75
专家分:0
注 册:2015-7-11
 问题点数:0 回复次数:7 
链表添加错误~~~


程序代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "Datastore.h"

int main()
{
    Datastore * store = ds_create();
    student obj;
    obj.id = 1;
    strcpy(obj.name,"zhangsan");
        ds_add(store,&obj);
    obj.id = 2;
    strcpy(obj.name,"zhangsan");
        ds_add(store,&obj);
    obj.id = 3;
    strcpy(obj.name,"zhangsan");
    ds_add(store,&obj);

    student * z = ds_find(store,3);
    printf("\n\n%d\t\t%s\n",z->id,z->name);


    show_printf(store);

    ds_destroy(store);

    return 0;
}



#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include"Datastore.h"

//*****************创建于销毁**********************/
 Datastore * ds_create()

 {
    Datastore * store = (Datastore*)malloc(sizeof(Datastore *));
    store->head.next = NULL;
    return store;

 }


 void ds_destroy(Datastore* store)

 {
     student * p =store->head.next;
     while(p)
     {
         student * next=p->next;
         free(p);
         p=next;
     }

 }

 //************添加****************************//
void ds_add(Datastore* store,const student * data)
{
    student * copy =(student *)malloc(sizeof(student));
    *copy = *data;
    student * cur = store->head.next;
    student * pre = & store->head;
    while(cur)
    {
        if(copy->id < data->id)
            break;
        pre=cur;
        cur=cur->next;
    }
    copy->next = pre->next;
    pre->next=copy;

}
/*******************查找*********************/
student *ds_find(Datastore* store,int id)
{
    student * p = store->head.next;
    while(p)
    {
        if(p->id == id)
            return p;
        p=p->next;
    }
    
}
/******************删除************************/
void ds_remove(Datastore* store,int id)
{
    student * p = store->head.next;
    while(p)
    {
        if(p->id == id)
        {
            student * z = p;
            p=p->next;
            free(z);
        }
        p=p->next;
    }
}
/******************打印************************/
void show_printf(Datastore* store)
{
    student * p = store->head.next;
    while(p)
    {
        printf("ID = %d\t\t name = %s\n",p->id,p->name);
        p = p->next;
    
    }

}

//******************student 结构体****************//
struct student
{
    int id;
    char name[32];
    student *next;
};

struct Datastore
{
    student head ;
};

//*****************创建于销毁**********************/
Datastore * ds_create();

 void ds_destroy(Datastore* store);

 //************添加****************************//
void ds_add(Datastore* store,const student * data);
/*******************查找*********************/
student *ds_find(Datastore* store,int id);

/******************删除************************/
void ds_remove(Datastore* store,int id);

/******************打印************************/
void show_printf(Datastore* store);



如图所示, why? and
搜索更多相关主题的帖子: student obj head next void 
2018-09-08 12:31
幻紫灵心
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山咔咔里面
等 级:贵宾
威 望:53
帖 子:395
专家分:2640
注 册:2018-3-30
得分:0 
向空指针写入内容当然会出问题。

saber,别哭.
2018-09-08 13:23
a15022606145
Rank: 1
等 级:新手上路
帖 子:75
专家分:0
注 册:2015-7-11
得分:0 
回复 2楼 幻紫灵心
??? 哪里空?? 我小白 看不懂欸
2018-09-08 13:38
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
提供的代码好象不完整,没看到一些数据类型的声明
下面的语句好象也有问题,分配的空间大小只有指针类型的大小。
Datastore * store = (Datastore*)malloc(sizeof(Datastore *));
2018-09-08 15:06
a15022606145
Rank: 1
等 级:新手上路
帖 子:75
专家分:0
注 册:2015-7-11
得分:0 
回复 4楼 吹水佬
thank you  原来我申请的是一个指针 大小就是四  我现在指向结构体 好使了, 不过为什么用malloc啊  我感觉new和delete更好用呢?
2018-09-08 15:31
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 5楼 a15022606145
感觉好用就好,但要分清楚是C的还是C++的
2018-09-08 20:47
Mr_doge
Rank: 5Rank: 5
等 级:贵宾
威 望:10
帖 子:159
专家分:385
注 册:2018-6-28
得分:0 
回复 6楼 吹水佬
请问下dalao,LZ的代码在****添加****处使用了malloc()函数进行内存分配,该函数段结束前并没有调用free()函数对占用内存进行处理,是因为在别处有进行处理么,还是C++和C的语法差别?
我没接触过C++,可能我的问题会比较无意义,望见谅。


-----感谢dalao解答

[此贴子已经被作者于2018-9-10 14:33编辑过]

2018-09-10 14:08
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 7楼 Mr_doge
通常内存分配是相对于进程空间,进程终止关闭时由系统收回。
malloc()与free()是一对,有malloc()就应该有free(),这是好习惯。

2018-09-10 14:17



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-489692-1-1.html




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

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