这个是我写的结构体:
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);
}
是你创建链表的时候多创建了一个节点
你先创建了 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 即可
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!