| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 425 人关注过本帖
标题:关于链表的初始化、查找、删除等问题
只看楼主 加入收藏
jackyloncoln
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2009-3-6
结帖率:83.33%
收藏
已结贴  问题点数:20 回复次数:1 
关于链表的初始化、查找、删除等问题
程序代码:
/******************************************************************************
链表部分
******************************************************************************/
#define LIST_OK 0
#define LIST_FAILED -1
#include<stdlib.h>
#include<stdio.h>
/* 链表节点结构  */
typedef struct ListNode
{
    struct ListNode *pstPrev; /* 上一个节点 */
    struct ListNode *pstNext; /* 下一个节点 */
    unsigned long ulUserData; /* 用户数据 */
    unsigned long ulRefNum; /* 引用计数, 即如果两个节点的用户数据相同的话, 则系统中
                               只保留一个节点, 但是引用计数加1, 如果释放一个用户数据,
                               则引用计数减1, 当引用计数减为0时才真正释放节点 */
}LIST_NODE_S;


/* 链表头结构 */
typedef struct ListHead
{
    struct ListNode pstFirstNode; /* 第一个节点 */    
    struct ListNode pstLastNode; /* 最后一个节点 */
    unsigned long ulListSize; /* 链表大小,即不包括表头的链表节点数 */
}LIST_HEAD_S;

LIST_HEAD_S g_stTestListHead;


void List_Init(LIST_HEAD_S* pstListHead)//链表初始化
{
    pstListHead = (LIST_HEAD_S*)malloc(sizeof(LIST_HEAD_S));
    if(!pstListHead)
    {
       exit(LIST_FAILED);
    }
    pstListHead->pstFirstNode = NULL;
    pstListHead->pstLastNode = NULL;
    
    pstListHead->ulListSize = 0;

}



void List_AddNode(LIST_HEAD_S* pstListHead, unsigned long ulUserData)//添加结点
{
    LIST_NODE_S *s,*p;
    s = (LIST_NODE_S *)malloc(sizeof(LIST_NODE_S));
    if(!s)
    {
        exit(LIST_FAILED);
    }
    pstListHead->pstFirstNode = p;
    s->ulUserData = ulUserData;    
    s->pstNext = p;
    s->pstPrev = p->pstPrev;
    p->pstPrev->pstNext = s;
    p->pstPrev = s;
    pstListHead->ulListSize++;
    s->ulRefNum++;

}


long List_DelNode(LIST_HEAD_S* pstListHead, unsigned long ulData)//删除节点
{
    LIST_NODE_S *p,*s;
    pstListHead->pstFirstNode = p;
    p->pstNext = s;
    if(p->ulRefNum != ulData)
    {
          p = s;
          s = s->pstNext;
    }
    p->pstPrev->pstNext = s;
    p->pstNext->pstPrev = p->pstPrev; 
    free(p);
    pstListHead->ulListSize--;
    
    return 1;
}


LIST_NODE_S* List_FindNode(LIST_HEAD_S* pstListHead, unsigned long ulData)//查找节点
{    
    LIST_NODE_S *p,*s;
    pstListHead->pstFirstNode = p;
    p->pstNext = s;
    if(p->ulUserData != ulData)
    {
        p = s;
        s = s->pstNext;
    }
    if(p->ulUserData = ulData)  
    {
    return p->ulUserData;
    }    
    else
        return -1;
}



void List_ClearList(LIST_HEAD_S* pstListHead)//清空链表
{
    LIST_NODE_S *p,*s;
    pstListHead->pstFirstNode = p;
    p->pstNext = s;
    if(s->pstNext != pstListHead)
    {
    p = s;
    s = s->pstNext;
    }
    while(pstListHead->pstFirstNode)
    {
    p->pstNext = pstListHead;
    free(s);
    s = p;
    p = p->pstPrev;
    }
       
}


其中,各个函数名是要求的,不能改动,函数内容是我写的,但是有类似的几处错误,我不知道怎么改。
不用写主函数。
搜索更多相关主题的帖子: 链表 删除 
2009-07-22 15:54
himpo
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:192
专家分:123
注 册:2008-5-16
收藏
得分:20 
void List_Init(LIST_HEAD_S* pstListHead)//链表初始化
{
    pstListHead = (LIST_HEAD_S*)malloc(sizeof(LIST_HEAD_S));
    if(!pstListHead)
    {
       exit(LIST_FAILED);
    }
    pstListHead->pstFirstNode = NULL;
    pstListHead->pstLastNode = NULL;
   
    pstListHead->ulListSize = 0;

}
pstListHead->pstFirstNode = NULL;

此时pstListHead->pstFirstNode为一个struct ListNode型的结构体变量,而不是一个指针,不能直接NULL.

可改为(pstListHead->pstFirstNode).pstPrev=NULL;
      (pstListHead->pstFirstNode).pstNext=NULL;

下面的pstListHead->pstFirstNode = p都是不可以的....
2009-07-22 16:56
快速回复:关于链表的初始化、查找、删除等问题
数据加载中...
 
   



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

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