首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

大侠指教啊为什么小弟我的头指针老是指向队尾,错哪了

2013-01-09 
大侠指教啊,为什么我的头指针老是指向队尾,哪里错了typedef struct node{struct node *pre//指向前一个结

大侠指教啊,为什么我的头指针老是指向队尾,哪里错了
typedef struct node
{
struct node *pre;    //指向前一个结点指针
struct node *next;   //指向下一个结点指针
char *data;          //数据
int nlen;            //数据长度        
}Node;

//定义带头结点的双向链表   
typedef struct doublyLinkedList
{  
Node *head;          //头指针
Node *rear;          //尾指针
int size;            //队列长度 
}dLinkedList;  

QUEUE_HANDLE creatlist(void)
{
dLinkedList *dLL = new dLinkedList;
if (dLL == NULL)
{
printf("开辟空间失败");
return NULL;
}
dLL->head = NULL;
dLL->rear = NULL;
 dLL->size = 0;
return dLL;
}
//队列前插入结点
int insertHead(QUEUE_HANDLE phandle, char *pdata, int *plen)

dLinkedList *pL = (dLinkedList *)phandle;
    Node *p = NULL;  
    if(pL == NULL)
{  
        printf("双向链表不存在/n");  
        return -1;  
    }  
    p = new Node;  
//    p = (Node*)malloc(sizeof(Node));  
    if(p == NULL)
{  
        printf("内存分配失败!/n");  
        return -1;  
    } 
p->data = new char[*plen];
memcpy(p->data, pdata, *plen);
//    p->data = pdata;
p->nlen = *plen;
if (pL->head == NULL)
{
pL->head = p;
pL->rear = p;
pL->size++;
}
else
{
p->next = pL->head;  
if(pL->head != NULL)
{  
pL->head->pre = p;  
}  
p->pre = NULL;  
pL->head = p;  
pL->size++;
}
return 0;
}  

//队列后插入结点
int insertRear(QUEUE_HANDLE phandle, char *pdata, int *plen)
{  
dLinkedList *pL = (dLinkedList *)phandle;
    Node *p = NULL;  
    if(pL == NULL)
{  
        printf("双向链表不存在/n");  
        return -1;  
    }  
    p = new Node;  
//    p = (Node*)malloc(sizeof(Node));  
    if(p == NULL)
{  
        printf("内存分配失败!/n");  
        return -1;  
    }
p->data = new char[*plen];
memcpy(p->data, pdata, *plen);


    p->data = pdata; 
p->nlen = *plen;
if (pL->head == NULL)
{
pL->head = p;
pL->rear = p;
pL->size++;
}
else
{
pL->rear->next = p;
if(p != NULL)
{  
p->pre = pL->rear;  
}  
p->next = NULL;  
pL->rear = p;  
pL->size++;
}
return 0;
}
//边插入边排序从小到大
int insertsortRearToHead(QUEUE_HANDLE phandle, char *pdata, int plen)
{
dLinkedList *pL = (dLinkedList *)phandle;
if (pL == NULL)
{
printf("双向链表不存在!");
return -1;
}
int nNowData = *(int *)(pdata + 4);

Node *pnode = new Node;
if (pnode == NULL)
{
printf("开辟空间失败!");
return -1;
}
  pnode->data = new char[plen];
  memcpy(pnode->data, pdata, plen);
pnode->nlen = plen;
pnode->next = NULL;
pnode->pre = NULL;
    if(pL->head == NULL)
{  
        printf("双向链表为空,队尾插入数据!\n");
insertRear(pL, pdata, &plen);
int nheadData = *(int *)(pdata + 4);
        return 0;  
    }
Node *p = NULL;
Node *q = NULL;
    p = pL->rear;  
bool bFlag = true; 
    while(p != NULL)

int ndata = *(int *)(p->data + 4);
if (nNowData >= ndata)

int nhead = *(int *)(pL->head->data + 4);
//printf("nhead%d ", nhead);

if (p == pL->rear)
{
insertRear(pL, pdata, &plen);
return 0;
}
else
{
pnode->pre = p;
pnode->next = q;
p->next = pnode;
q->pre = pnode;
pL->size++;
}
bFlag = false;
break;
}
else
{
q = p;
p = p->pre;
//continue;
}         
    } 
if (bFlag = false)//p == NULL
{
        insertHead(pL, pdata, &plen);
}
return 0;
}
[解决办法]


[解决办法]
最后的那个
    if (bFlag = false)//p == NULL 

这应该是if (!bFlag)吧,(bFlag = false)永远为真啊
    {
        insertHead(pL, pdata, &plen);
    }
    return 0;

[解决办法]
false和NULL不是一回事。

热点排行