BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #16607同步于 2008/11/25
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

[求助]关于链表,大牛帮下忙

Drust0101
2008/11/25镜像同步9 回复
函数要求是把一个递增链表中大于mink且小与maxk的元素删除,我做了个带头结点的链表里面元素为1-20.头结点保存的是元素个数,但我写的函数在0-9的范围内工作正常,大于9就报错了.逻辑应该没问题,哪位大牛帮忙解答下?代码如下: typedef struct LNode{ int data; LNode* next; }LNode,*LinkList; int DeleteN(LinkList L,int mink,int maxk) { LinkList pst,pdlt; int num=0; if(mink>maxk || L->data==0) { return -1; } while(L->next->data<=mink && L->next!=NULL) { L=L->next; } if(L->next==NULL) {return 0;} pst=L; L=L->next; while(L->next->data<maxk && L->next!=NULL) { pdlt=L; L=pdlt->next; free(pdlt); num++; } if(L->data<maxk) { pst->next=L->next; free(L); num++; } return num; }
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
sunnyU机器人#1 · 2008/11/25
typedef struct node { int data; struct node *next; }node; int deleteN(node *head, int mink, int maxk) { int num = 0; node *p,*pre; if (mink > maxk || head->data <= 0) return 0; for (p = head->next, pre = head; p; p = p->next) { if (p->data > mink) break; pre = p; } while (p && p->data < maxk) { pre->next = p->next; free(p); p = pre->next; head->data--; num++; } return num; }
Drust0101机器人#2 · 2008/11/25
【 在 sunnyU 的大作中提到: 】 : typedef struct node { : int data; : struct node *next; : ................... 谢了呵,我试了你的代码问题还是存在,大于一定值时出现错误,比如2-12的范围内,是我机器的问题?
sunnyU机器人#3 · 2008/11/25
看一下别的部分代码有没有问题,发个完整一点的,可以参考一下: (输入元素以零结束) #include <stdio.h> #include <stdlib.h> #include <assert.h> typedef struct node { int data; struct node *next; }node; node *root = NULL; // 头节点 // 插入元素x到链表中 void insert(node *head, int x) { node *p,*q; assert(head); // 头节点必须已存在 // 新建节点 q = (node *)malloc(sizeof(node)); q->data = x; // 查找位置 for (p = head; p->next; p = p->next) if (p->next->data >= x) break; // 插入 q->next = p->next; p->next = q; head->data++; } // 输入若干个数,构建递增链表 void construct() { int x; if (!root) { root = malloc(sizeof(node)); root->data = 0; root->next = NULL; } // 读入数据并插入到链表中,读入0时结束 while (scanf("%d",&x) != EOF && x) { insert(root, x); } } // 打印链表 void print(node *head) { node *p; assert(head); // 头节点必须已存在 printf("The Linklist now as follows(%d elements):\n",head->data); for (p = head->next; p; p = p->next) printf("%d ",p->data); printf("\n"); } // 删除大于mink,小于maxk的元素 int deleteN(node *head, int mink, int maxk) { int num = 0; node *p,*pre; assert(head); // 头节点必须已存在 if (mink > maxk || head->data <= 0) return 0; // 找开始位置 for (p = head->next, pre = head; p; p = p->next) { if (p->data > mink) break; pre = p; } // 删除 while (p && p->data < maxk) { pre->next = p->next; free(p); p = pre->next; head->data--; num++; } return num; } int main() { int k,mink,maxk; // 读入元素并构建相应链表 printf("Please input the elements of the Linklist.\n"); printf("Seperate them by blank spaces and end with 0.\n"); construct(); // 打印 print(root); // 读入范围 printf("Please input mink and maxk.\n"); scanf("%d%d",&mink,&maxk); // 删除大于mink并小于maxk的元素 k = deleteN(root,mink,maxk); printf("Have delete %d elements\n",k); // 打印 print(root); return 0; }
Wavestone机器人#4 · 2008/11/25
死了,看代码就烦,等楼下的大牛
wks机器人#5 · 2008/11/25
为什么要在头节点里保存节点数目? 这很危险,因为你保存的节点数目可能和实际节点数目不一致。 你究竟是相信哪个呢?而且如果没有恰当的同步,很容易出错的。 Never repeat yourself. 除非你想提高效率。
wks机器人#6 · 2008/11/25
typedef struct LNode{ int data; LNode* next; }LNode,*LinkList; int DeleteN(LinkList L,int mink,int maxk) { LinkList pst,pdlt; int num=0; if(mink>maxk || L->data==0) { return -1; } while(L->next->data<=mink && L->next!=NULL) // 你在判断L->next!=NULL之前就试图去读取L->next->data。万一L->next==NULL,马上就出错了。 { L=L->next; } if(L->next==NULL) {return 0;} pst=L; L=L->next; while(L->next->data<maxk && L->next!=NULL) // 同样的问题 { pdlt=L; L=pdlt->next; free(pdlt); num++; } if(L->data<maxk) { pst->next=L->next; free(L); num++; } return num; } 【 在 Drust0101 的大作中提到: 】 : 函数要求是把一个递增链表中大于mink且小与maxk的元素删除,我做了个带头结点的链表里面元素为1-20.头结点保存的是元素个数,但我写的函数在0-9的范围内工作正常,大于9就报错了.逻辑应该没问题,哪位大牛帮忙解答下?代码如下: : typedef struct LNode{ : int data; : ...................
Drust0101机器人#7 · 2008/11/25
【 在 wks 的大作中提到: 】 : typedef struct LNode{ : int data; : LNode* next; : ................... 噢.... 那如果次序反一下呢??先判断非空? 现在有个问题是确定链表没问题,合法的数据一部分确不行...
wks机器人#8 · 2008/11/25
那就可以。 C/C++里面的&&是短路的。 也就是,如果 a && b 那么,如果a是假,那么b的值根本就不去求。 因此,L->next!=NULL && L->next->data<something是安全的。 如果L->next==NULL,就不去试图求L->next->data的值了。 【 在 Drust0101 的大作中提到: 】 : 噢.... 那如果次序反一下呢??先判断非空?
Drust0101机器人#9 · 2008/11/25
【 在 wks 的大作中提到: 】 : 那就可以。 : C/C++里面的&&是短路的。 : 也就是,如果 a && b : ................... 噢,谢了哈~~ 学到了...漏洞百出啊`~~~,不过那个问题好象还是没解决...?