sip100105 2015-06-28 07:16 采纳率: 100%
浏览 1577
已采纳

关于C语言链表的一些问题,代码怎么都运行不成功跪求大神指点

头文件如下:

 #ifndef _LINKLIST_H_
#define _LINKLIST_H_
typedef void Link;
typedef struct _LinkListNode
{
    struct _LinkListNode * next;
}LinkListNode;
Link * LinkList_create();
int LinkList_insert(Link*, int, LinkListNode *);
int LinkList_getlength(Link *);
LinkListNode * LinkList_get(Link *, int);
int LinkList_clear(Link*);
LinkListNode *LinkList_gethead(Link *);
LinkListNode *LinkList_gettail(Link*);
#endif

实现如下:

 #include"linklist.h"
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
typedef struct _TlinkList
{
    LinkListNode node;
    LinkListNode tail;
    int length;
}Tlinklist;
Link * LinkList_create()
{
    Tlinklist * list = (Tlinklist*)malloc(sizeof(Tlinklist));
    list->length = 0;
    list->node.next = NULL;
    list->tail.next = NULL;
    return list;
}
int  LinkList_insert(Link* list, int pos, LinkListNode *node)
{
    Tlinklist* tlist = (Tlinklist*)list;
    if (list == NULL || node == NULL || pos < 0)
    {
        return -1;
    }
    int length = tlist->length;
    LinkListNode* p = &tlist->node;
    ///if(pos >= length)
    //  {
    //      pos = length;
    //  }
    int i = 0;
    for (i = 0; (i < pos) && p->next != NULL; i++)
    {
        p = p->next;
    }
    node->next = p->next;
    p->next = node;
    //printf("%dNEXT\n",(int)node->next);
    //  printf("%dNODE\n",(int)node);
    tlist->length++;
    if (tlist->length == 1 || pos == tlist->length)
    {
        tlist->tail.next = node;
    }
    return 5;
}
int LinkList_getlength(Link *list)
{
    Tlinklist* tlist = (Tlinklist*)list;
    if (list == NULL)
    {
        return -1;
    }
    return tlist->length;
}
LinkListNode * LinkList_get(Link *list, int pos)
{
    Tlinklist* tlist = (Tlinklist*)list;
    LinkListNode * ret = NULL;
    LinkListNode * current = &tlist->node;
    if (list == NULL)
    {
        return NULL;
    }
    int i = 0;
    for (i; i< pos; i++)
    {
        current = current->next;
    }
    ret = current->next;
    return ret;
}
int LinkList_clear(Link* list)
{
    return 0;
}
LinkListNode *LinkList_gethead(Link * list)
{
    return;
}
LinkListNode * LinkList_gettail(Link* list)
{
    return;
}

测试如下:

#include"linklist.h"
#include<stdio.h>
typedef struct _teacher
{
    int age;
}Teacher;
int main()
{
    Teacher t1;
    t1.age = 100;
    Teacher t2;
    t2.age = 2;
    Teacher t3;
    t3.age = 3;
    Link * list = LinkList_create();
    LinkList_insert(list, 0, (LinkListNode*)(&t1));
    Teacher * tp = (Teacher*)LinkList_get(list, 0);
    printf("%d\n", tp->age);
    LinkList_insert(list, 1, (LinkListNode*)(&t2));
    LinkList_insert(list, 2, (LinkListNode*)(&t3));
    //  printf("%d\n",LinkList_getlength(list));

    //Teacher * tp =(Teacher*)LinkList_get(list, 0);
    printf("%d\n", tp->age);
    system("pause");
} 

问题是为什么运行LinkList_insert后tp->age变为0;

  • 写回答

2条回答 默认 最新

  • 真心无著 2015-06-28 10:33
    关注

    你不能够把Teacher类型来当作LinkListNode类型来操作
    按你的意思,应作如下修改:
    1. 在LinkListNode结构体里添加一个成员变量data,以存放用户数据:
    typedef struct _LinkListNode
    {
    struct _LinkListNode * next;
    void * data;
    }LinkListNode;

    1. 添加对LinkListNode的data成员的初始化语句 在LinkList_create()函数的第3行下面插入一行: list->node.data = NULL;
    2. 把main函数修改如下:
      int main()
      {
      Teacher t1;
      t1.age = 100;
      Teacher t2;
      t2.age = 2;
      Teacher t3;
      t3.age = 3;
      LinkListNode *pNode1 = new ListListNode();
      pNode1->next = null;
      pNode1->data = &t1;

      LinkListNode *pNode2 = new ListListNode();
      pNode2->next = null;
      pNode2->data = &t2;
      
      LinkListNode *pNode3 = new ListListNode();
      pNode3->next = null;
      pNode3->data = &t3;
      

      Link * list = LinkList_create();
      LinkList_insert(list, 0, pNode1);

      LinkListNode * pCurNode = LinkList_get(list, 0);
      Teacher *tp = (Teacher *)pCurNode->data;
      printf("%d\n", tp->age);
      LinkList_insert(list, 1, pNode2);
      LinkList_insert(list, 2, pNode3);

      //释放资源
      LinkList_clear();
      

      system("pause");
      }

    3. LinkList-clear()也要完善以释放链表里的资源。

    希望能帮到你。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度