user-0 提问:  0xC0000005: 读取位置 0x00000030 时发生访问冲突，双向链表中插入将节点插入尾部这样写有错吗？

回复:
user: user-0
content: void insertclosed(Node *closed,Node *node)//将节点插入到双向链表closed的尾部 { 	if((closed->next==NULL)&&(closed->pre==NULL)) 	{ 		closed->next=closed->pre=node; 		node->pre=node->next=closed; 	} 	else 	{ 		Node *q=(Node *)malloc(sizeof(Node)); 		q=closed; 		while(q->next!=closed) 		{ 			q=q->next; 		} 		node->pre=q; 		node->next=closed; 		q->next=node; 		closed->pre=node; 		 	} } 现在还是不行啊

user: user-0
content: 是执行到这句时出错while(q->next!=closed)，弹出弹窗信息！

user: user-1
content: 如果closed参数是空的 不就悲剧了？

user: user-2
content: 双链表，需要找到尾节点 链表closed 不为NULL，node是单一节点 ，有数据，或者为NULL void insertclosed(Node *closed,Node *node)//将节点插入到双向链表closed的尾部 {       ASSERT(closed && node);       if(!closed)return; //由于头节点，不可改变，所以空的链表，无法插入数据。       if(!node)return;   //插入空节点，不用做任何事情。       Node *rear = closed;       while( rear->next ){//尾节点的next必为NULL          rear = rear->next;       }       rear->next = node;  //尾节点rear的next ，置为新的尾节点 node       node->pre  = rear;  //新的尾节点 node的pre,置为原尾节点 rear       node->next = NULL;  //新的尾节点node的next， 置为 NULL；         }  双链表closed 不为NULL，node是是另一个双链表 ，有数据,或者为空的链表 //void insertclosed(Node *closed,Node *node)//将节点插入到双向链表closed的尾部 有鉴于，这个函数的实际意义，是合并两个链表，改名为合并 void mergeclosed(Node *closed,Node *node) {       Node* p,*q;//closed尾节点p,node尾节点q       ASSERT(closed && node);       if(!closed)return; //由于头节点，不可改变，所以空的链表，无法插入数据。       if(!node)return;       p = closed; //closed尾节点       while( p->next ){//尾节点的next必为NULL          p = p->next;       }       q= node;//node尾节点       while( q->next ){//尾节点的next必为NULL            q = q->next;       }       node->pre   = p;     // node的头节点的pre ,指向closed尾节点p       p->next     = node;  // closed尾节点 p的 next ，指向node 的头节点node        }  双向循环链表closed 不为NULL，node是单一节点 ，有数据，或者为NULL void insertclosed(Node *closed,Node *node)//将节点插入到双向链表closed的尾部 {       ASSERT(closed && node);       if(!closed)return; //由于头节点，不可改变，所以空的链表，无法插入数据。       if(!node)return;        node->pre  = closed->pre;  // 新的尾节点的pre ,指向原尾节点       node->next = closed;       // 新的尾节点的next，指向头节点       closed->pre->next = node;  // 尾节点的 next ，指向新的尾节点 node       closed->pre = node;        // 头节点的pre，指向新的尾节点的node }  双向循环链表closed 不为NULL，node是是另一个双向循环链表 ，有数据,或者为空的链表 //void insertclosed(Node *closed,Node *node)//将节点插入到双向链表closed的尾部 有鉴于，这个函数的实际意义，是合并两个链表，改名为合并 void mergeclosed(Node *closed,Node *node) {       Node* p,*q;       ASSERT(closed && node);       if(!closed)return; //由于头节点，不可改变，所以空的链表，无法插入数据。       if(!node)return;         p = closed->pre; //closed尾节点       q = node ->pre;  //node尾节点           node->pre   = p;      // 新的尾节点的pre ,指向closed尾节点p       p->next     = node;   // closed尾节点的 next ，指向node 的头节点node        q->next     = closed; // node 的的尾节点q的next，指向closed的头节点closed       closed->pre = q;      // closed头节点的pre，指向node的尾节点的q }

user: user-3
content: 缓冲区指针为空， 访问出错

user: user-2
content: 双向循环链表closed 不为NULL，node是单一节点 ，有数据，或者为NULL void insertclosed(Node *closed,Node *node)//将节点插入到双向链表closed的尾部 {       ASSERT(closed && node);       if(!closed)return; //由于头节点，不可改变，所以空的链表，无法插入数据。       if(!node)return;        node->pre  = closed->pre;  // 新的尾节点的pre ,指向原尾节点       node->next = closed;       // 新的尾节点的next，指向头节点       closed->pre->next = node;  // 尾节节点的 next ，指向新的尾节点 node       closed->pre = node;        // 头节点的pre，指向新的尾节点的node }  双向循环链表closed 不为NULL，node是是另一个双向循环链表 ，有数据,或者为空的链表 //void insertclosed(Node *closed,Node *node)//将节点插入到双向链表closed的尾部 有见于这个函数的实际意义是合并两个链表，改名为合并 void mergeclosed(Node *closed,Node *node) {       Node* p,*q;       ASSERT(closed && node);       if(!closed)return; //由于头节点，不可改变，所以空的链表，无法插入数据。       if(!node)return;         p = closed->pre; //closed尾节点       q = node ->pre;  //node尾节点           node->pre   = p;     // 新的尾节点的pre ,指向closed尾节点p       p->next     = node;     // closed尾节点的 next ，指向node 的头节点node        q->next     = closed;   // node 的的尾节点q的next，指向closed的头节点closed       closed->pre = q; // closed头节点的pre，指向node的尾节点的q }

user: user-2
content: 1）你到底是双向链表，还是双向循环链表。 2）需不需要处理指针为 NULL 的情况。

user: user-4
content: if((closed->next==closed)&&(closed->pre==closed))  这句啥意思，没明白，怎么前后都指向自身？

user: user-5
content: (1) Node *q=(Node *)malloc(sizeof(Node));         q=closed; 这里内存泄漏了，你个q分了内存，又把它直接变成closed.  (2) while(q->next!=closed)         {             q=q->next;         } 就相当于你的closed是个循环链表。如果传入的不是，就crash