c语言循环fault,c语言数据结构的一个题 总是segmentation fault

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

在while循环里面的时候 最后一次循环结束之后就直接报错(windows是直接结束, linux的虚拟机说segmentation

fault),有可能是我访问了没有分配的内存,但是我自己分析之后觉得没有一个指针访问了非法内存啊,

就不知道怎么办了。

分析图和代码:

d84a42b74b3782ef675de026a90265bb.png

/*

* 该程序的目的主要是将链表的奇偶索引分开链接,再连上。如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;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值