该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
在while循环里面的时候 最后一次循环结束之后就直接报错(windows是直接结束, linux的虚拟机说segmentation
fault),有可能是我访问了没有分配的内存,但是我自己分析之后觉得没有一个指针访问了非法内存啊,
就不知道怎么办了。
分析图和代码:
/*
* 该程序的目的主要是将链表的奇偶索引分开链接,再连上。如1-2-3-4-5-6
* 拆分成1-3-5 2-4-6 然后链接起来变成1-3-5-2-4-6
* !注意:是“索引”的排序
*/
#include
#include
struct ListNode {
int val;
struct ListNode *next;
};
typedef struct ListNode Node;
Node* AllocateNode(int c);
void prn_list(Node* head);
struct ListNode* oddEvenList(struct ListNode* head);
int main(void)
{
Node *head, *current;
int i;
/* 定义头节点和移动节点 */
head = current = AllocateNode(1);
/* 循环给链表加节点 最后生成 1->2->3->4->5->6的链表*/
for(i = 2; i < 7; i++){
current->next = AllocateNode(i);
current = current->next;
}
/* 递归打印链表 */
prn_list(head);
head = oddEvenList(head);
prn_list(head);
return 0;
}
/* 递归打印链表 */
void prn_list(Node* head)
{
if(head == NULL){return;}
printf("val = %d->\n", head->val);
prn_list(head->next);
}
/* 动态分配节点 */
Node* AllocateNode(int c)
{
Node* p = (Node*)malloc(sizeof(Node*));
if(p == NULL){
printf("allocation faliure!\n");
exit(1);
}
p->val = c;
p->next = NULL;
return p;
}
/* 奇偶索引重新排序 */
struct ListNode* oddEvenList(struct ListNode* head) {
struct ListNode *p, *odd_start, *even_start, *even_head;
if(head == NULL || head->next == NULL || head->next->next == NULL){
return head;
}
/* 奇索引链表的头节点(指向1)*/
odd_start = head;
/* 偶索引链表的头节点,临时指针p,偶索引链表的移动节点 (都指向2)*/
even_start = p = even_head = head->next;
/* 链接1->3*/
head->next = head->next->next;
/* 如果有偶数个节点 p会指向NULL(奇数个时 p指向一个偶数节点)*/
while(p != NULL || p->next != NULL){
/* 移动head到3 */
head = head->next;
/* 链接2->4*/
even_head->next = p = head->next;
/* 移动偶索引链表的移动节点到4*/
even_head = even_head->next;
/* 链接3->5*/
head->next = head->next->next;
/* 测试 */
printf("p->next = %d\n", p->next);
printf("head->next = %d\n", head->next);
}
if(p == NULL){
head->next = even_start;
return odd_start;
}
else{
head->next->next = even_start;
return odd_start;
}
}