双向链表的排序问题,结果为什么总有一个奇奇怪怪的数

写了一个随机双向链表,排序操作有问题,导致我在进行排序的时候,总是会出现一个不知道哪来的数,请大家帮我看看是函数写的有问题还是在创建链表的时候我多创了空间导致他自己写了个数在里面。

这个是我写的结构体:
typedef struct ltbl
{
struct ltbl* pPre; //前一个
struct ltbl* pNxt; //后一个
int nKey; //结点里的值
unsigned char ucDummy[32]; //备用
}LTBL;

typedef struct mng
{
int nNodeCnt; //链表长度
LTBL* pHead; //指向头指针
}MNG;

这里是我的创建和排序:
int TBLCreate (MNG* pMng, int nCnt)
{
int i;
LTBL* head = NULL;
LTBL* p = NULL;
LTBL* q = NULL;
head = (LTBL*)malloc(sizeof(LTBL));
pMng->pHead = head;
srand((unsigned int)time(0));
pMng->nNodeCnt = nCnt;

if(NULL == head)
{
    printf("WRONG!");
    return NG;
}
head->pPre = NULL;
head->nKey = rand() % 200;
head->pNxt = NULL;
p = head;
for(i=1; i<=pMng->nNodeCnt; ++i)
{
    q = (LTBL*)malloc(sizeof(LTBL));
    if(NULL == q)
    {
        printf("WRONG!");
        return NG;
    }
    q->nKey = rand() % 200;
    p->pNxt = q;
    q->pPre = p;
    q->pNxt = NULL;
    p = q;
}
q->pNxt = NULL;
return OK;

}

void TBLSort(MNG* pMng, int nFlg)
{
int t = 0;
LTBL* head;
LTBL* p = NULL;
LTBL* q = NULL;
head = pMng->pHead;
if(0 == nFlg)
{
for(p=head; p!=NULL; p=p->pNxt)
{
for(q=p->pNxt; q!=NULL; q=q->pNxt)
{
if(p->nKey > q->nKey)
{
t = q->nKey;
q->nKey = p->nKey;
p->nKey = t;
}
}
}
}
if(1 == nFlg)
{
for(p=head; p!=NULL; p=p->pNxt)
{
for(q=p->pNxt; q!=NULL; q=q->pNxt)
{
if(p->nKey < q->nKey)
{
t = q->nKey;
q->nKey = p->nKey;
p->nKey = t;
}
}
}
}
Print(pMng);
}

运行结果及报错内容

img

我的解答思路和尝试过的方法 :我换的是结点里面的值 如果有人能告诉我怎么换结点就更好了 我试了很多办法都运行不了

是你创建链表的时候多创建了一个节点
你先创建了 head 首元节点之后 for (i = 1; i <= pMng->nNodeCnt; ++i) 循环NodeCnt次 (比如NodeCnt=10)
一共创建了 NodeCnt 加 1 (10+1=11)个节点
但是你 Print(pMng)函数只输出 10个节点,最后一个没有输出
而排序时是遍历全部11个节点,最后一个没有输出的节点也参与排序
再次 Print(pMng)输出还是只输出前 10个节点,之前没有输出的值排到了前面所以输出了, 排到最后的最大值又没有输出

你把for (i = 1; i <= pMng->nNodeCnt; ++i) 中i=1 改成 i=2 即可

如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

img

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632