网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
07月30日漏签0天
c语言吧 关注:798,888贴子:4,357,461
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 4回复贴,共1页
<<返回c语言吧
>0< 加载中...

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

  • 只看楼主
  • 收藏

  • 回复
  • hui忆里的乐章
  • 路人
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
在while循环里面的时候 最后一次循环结束之后就直接报错(windows是直接结束, linux的虚拟机说segmentation
fault),有可能是我访问了没有分配的内存,但是我自己分析之后觉得没有一个指针访问了非法内存啊,
就不知道怎么办了。
分析图和代码:

/*
* 该程序的目的主要是将链表的奇偶索引分开链接,再连上。如1-2-3-4-5-6
* 拆分成1-3-5 2-4-6 然后链接起来变成1-3-5-2-4-6
* !注意:是“索引”的排序
*/
#include <stdio.h>
#include <stdlib.h>
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;
}
}


  • free逍遥星空
  • 团子家族
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
既然要一个node大小空间,分配一个指针大小的空间干嘛


2025-07-30 14:59:29
广告
不感兴趣
开通SVIP免广告
  • hui忆里的乐章
  • 路人
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
顶一下。 还有人来吗。


  • free逍遥星空
  • 团子家族
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
oddEvenList完全不想看。。逻辑太混乱。给你重写了一个。
struct ListNode* oddEvenList(struct ListNode* head) {
struct ListNode *curr, *odd_start, *odd_tail, *even_start, *even_tail;
if (head == NULL || head->next == NULL || head->next->next == NULL){
return head;
}
curr = head->next->next;
odd_start = odd_tail = head;
even_start = even_tail = head->next;
int i = 1;
while (curr)
{
(i ? odd_tail : even_tail)->next = curr;
i ? odd_tail = odd_tail->next : even_tail=even_tail->next;
i ^= 1;
curr = curr->next;
}
odd_tail->next = even_start;
even_tail->next = NULL;
return odd_start;
}


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 4回复贴,共1页
<<返回c语言吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示