返回信息流函数要求是把一个递增链表中大于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;
}
这是一条镜像帖。来源:北邮人论坛 / cpp / #16607同步于 2008/11/25
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[求助]关于链表,大牛帮下忙
Drust0101
2008/11/25镜像同步9 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
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;
}
【 在 sunnyU 的大作中提到: 】
: typedef struct node {
: int data;
: struct node *next;
: ...................
谢了呵,我试了你的代码问题还是存在,大于一定值时出现错误,比如2-12的范围内,是我机器的问题?
看一下别的部分代码有没有问题,发个完整一点的,可以参考一下:
(输入元素以零结束)
#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;
}
为什么要在头节点里保存节点数目?
这很危险,因为你保存的节点数目可能和实际节点数目不一致。
你究竟是相信哪个呢?而且如果没有恰当的同步,很容易出错的。
Never repeat yourself.
除非你想提高效率。
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;
: ...................
【 在 wks 的大作中提到: 】
: typedef struct LNode{
: int data;
: LNode* next;
: ...................
噢.... 那如果次序反一下呢??先判断非空?
现在有个问题是确定链表没问题,合法的数据一部分确不行...
那就可以。
C/C++里面的&&是短路的。
也就是,如果 a && b
那么,如果a是假,那么b的值根本就不去求。
因此,L->next!=NULL && L->next->data<something是安全的。
如果L->next==NULL,就不去试图求L->next->data的值了。
【 在 Drust0101 的大作中提到: 】
: 噢.... 那如果次序反一下呢??先判断非空?
【 在 wks 的大作中提到: 】
: 那就可以。
: C/C++里面的&&是短路的。
: 也就是,如果 a && b
: ...................
噢,谢了哈~~ 学到了...漏洞百出啊`~~~,不过那个问题好象还是没解决...?