当前位置:  技术问答>linux和unix

一个小问题,请大家看看.....

    来源: 互联网  发布时间:2016-06-07

    本文导语:  #include  #include  #include  #define MAXLINE 100 /************************************************************************/ /*                    以下是关于队列链接存储操作的6种算法               */ /***************************************...

#include 
#include 
#include 

#define MAXLINE 100
/************************************************************************/
/*                    以下是关于队列链接存储操作的6种算法               */
/************************************************************************/
struct sNode{
    char *data;            /* 值域 */
    struct sNode *next;        /* 链接指针 */
};
struct queueLK{
    struct sNode *front;    /* 队首指针 */
    struct sNode *rear;        /* 队尾指针 */
};

/* 1.初始化链队 */
void initQueue(struct queueLK *hq)
{
    hq->front = hq->rear = NULL;        /* 把队首和队尾指针置空 */
    return;
}

/* 2.向链队中插入一个元素x */
void enQueue(struct queueLK *hq, char *x)
{
    /* 得到一个由newP指针所指向的新结点 */
    struct sNode *newP;
    newP = malloc(sizeof(struct sNode));
    if(newP == NULL){
        printf("内存空间分配失败! ");
        exit(1);
    }

newP->data = malloc(MAXLINE * sizeof(char));
    /* 把x的值赋给新结点的值域,把新结点的指针域置空 */
    //newP->data = x;
strncpy(newP->data,x,strlen(x));
    newP->next = NULL;
    /* 若链队为空,则新结点即是队首结点又是队尾结点 */
    if(hq->rear == NULL){
        hq->front = hq->rear = newP;
    }else{    /* 若链队非空,则依次修改队尾结点的指针域和队尾指针,使之指向新的队尾结点 */
        hq->rear = hq->rear->next = newP;        /* 注意赋值顺序哦 */
    }
    return;
}

/* 3.从队列中删除一个元素 */
char* outQueue(struct queueLK *hq)
{
    struct sNode *p;
    char *temp;
    /* 若链队为空则停止运行 */
    if(hq->front == NULL){
        printf("队列为空,无法删除! ");
        exit(1);
    }
temp = malloc(MAXLINE * sizeof(char));
    //temp = hq->front->data;        /* 暂存队尾元素以便返回 */
strncpy(temp,hq->front->data,strlen(hq->front->data));
    p = hq->front;                /* 暂存队尾指针以便回收队尾结点 */
    hq->front = p->next;        /* 使队首指针指向下一个结点 */
    /* 若删除后链队为空,则需同时使队尾指针为空 */
    if(hq->front == NULL){
        hq->rear = NULL;
    }
    free(p);        /* 回收原队首结点 */
    return temp;    /* 返回被删除的队首元素值 */
}

/* 4.读取队首元素 */
char * peekQueue(struct queueLK *hq)
{
    /* 若链队为空则停止运行 */
    if(hq->front == NULL){
        printf("队列为空,无法删除! ");
        exit(1);
    }
    return hq->front->data;        /* 返回队首元素 */
}

/* 5.检查链队是否为空,若为空则返回1, 否则返回0 */
int emptyQueue(struct queueLK *hq)
{
    /* 判断队首或队尾任一个指针是否为空即可 */
    if(hq->front == NULL){
        return 1;
    }else{
        return 0;
    }
}

/* 6.清除链队中的所有元素 */
void clearQueue(struct queueLK *hq)
{
    struct sNode *p = hq->front;        /* 队首指针赋给p */
    /* 依次删除队列中的每一个结点,最后使队首指针为空 */
    while(p != NULL){
        hq->front = hq->front->next;
        free(p);
        p = hq->front;
    }    /* 循环结束后队首指针已经为空 */
    hq->rear = NULL;        /* 置队尾指针为空 */
    return;
}

/************************************************************************/

int main(int argc, char* argv[])
{
    struct queueLK q;
    FILE *fp;
char buf[100];
int len;

fp = fopen("test.txt","r");

initQueue(&q);
while(!feof(fp)){
fgets(buf,100,fp);
len = strlen(buf);
buf[len - 1] = '';
enQueue(&q,buf);
}
    while(!emptyQueue(&q)){
printf("%sn",outQueue(&q));
    }
    clearQueue(&q);
close(fp);
return 0;
}


上面代码的基本功能是:创建了一个队列,定义它的基本的六种操作,从文件test.txt按行读取数据,然后建立一个队列
队列建好后,输出队列中的内容,输出结果有点奇怪:
test.txt文件中存的是:
.1.3.6.1.2.1.1
.1.3.6.1.4.1.4981.2.1.2.1
但输出多了一行数据:
.1.3.6.1.2.1.1
.1.3.6.1.4.1.4981.2.1.2.1
.1.3.6.1.4.1.4981.2.1.2.
实在不知道最后一行是怎么多出来的?大家能帮忙看下代码吗?

|

    while(true){
        fgets(buf,100,fp);
        if(feof(fp))
           break;
        len = strlen(buf);
        buf[len - 1] = '';
        enQueue(&q,buf);
    }

    
 
 

您可能感兴趣的文章:

  • iptables规则问题,请大家帮忙看看怎么回事
  • 在编译内核时候出现问题,大家来帮忙看看是什么问题?怎么解决?
  • 关于全选的问题大家帮忙看看~
  • 大家去软件工程论坛里面去看看那,我发了700分的问题!!
  • redhat as3.0 java定时不能执行!请大家看看,问题在哪?
  • 虚心请教问题,帮我看看好吗?
  • 求人看看这个shell问题
  • 帮我看看我的sql语句写的有什么问题?
  • 关于arm交叉编译的问题,请帮忙看看问题出在什么地方?
  • 请帮我看看这个网络设置的问题
  • 大家帮我看看这个是什么问题
  • 大家能帮忙看看这个帖子的问题吗?
  • 看看这个代码问题在哪?
  • 帮忙看看下边代码有什么问题
  • 看看谁能解决这个问题?
  • 大家帮忙看看,是什么问题
  • 在浏览器里连接本机的菜鸟问题,帮忙看看!
  • 大侠帮忙看看,重定向问题
  • 关于用Jprint java打印的问题,请大家进来看看(路人甲、华仔哥)
  • 见不得人的问题,能帮我看看么
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 修改配置真正解决php文件上传大小限制问题(nginx+php)
  • 简单问题简单问题简单问题简单问题
  • 修改配置真正解决php文件上传大小限制问题(apache+php)
  • 小问题,急问题,重大问题!!!
  • sharepoint 2010中item.Update()和item.SystemUpdate 修改数据版本问题解决
  • 弱弱的一问,linux下的中文问题及网络问题,分不是问题
  • 八个问题帮你快速了解Docker
  • 请教两个小问题:一个cgywin下使用vi的问题,另一个socket的问题
  • 错误:将'const x'作为'x'的'this'实参时丢弃了类型限定问题解决
  • 网页的编码问题!或者java的编码问题,由此引出一条解决中文问题的思路
  • nginx Windows版相关问题及使用说明
  • 死锁的问题 多级锁定问题 循环锁定问题
  • vs2010下禁用vmware的方法以及解决vmware插件导致vs2010变慢的问题
  • [问题]双系统出现的问题!求问题的原因和解决办法!
  • Linux下时钟同步问题:Clock skew detected原因分析及解决方法
  • 博客 iis7站长之家
  • c/c++服务器程序内存泄露问题分析及解决
  • C程序问题:哪个高手帮我解释下下面的问题,主要是a[0]和&[0] 的区别 和编译器的问题??
  • ​部署 Docker 前必须问自己的四个问题
  • swing的问题还是jbuiler的问题??
  • spring的事务类型及spring和hibernate可能导致的问题分析
  • 菜鸟第一次安装红帽子7.2的一箩筐问题。每个问题会开个帖子,各放100分!请有安装经验的老鸟们帮忙解决。第二个问题:什么是LILO?怎么样


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3