QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 794|回复: 4

编译一些以前写过的数据结构中实验代码,可是出现了奇怪的问题

[复制链接]
发表于 2003-8-10 22:54:06 | 显示全部楼层 |阅读模式
最近编译一些代码包括实现链表、堆栈、二叉树和图的生成,插入,查询等功能
可是在编译通过之后运行程序会出现奇怪的现象,例如链表的代码大致如下:
[code:1]
#include <stdio.h>
#include <stdlib.h>

typedef struct node{
       char data;
       struct node *next;
}LNode;

int create(LNode *h){
       LNode *ptr;
       int i=0;  int n=0;
       char tmp;
       h=NULL;
       printf("input the number of list:\n");
       scanf("%d",&n);
       for(;i<n;i++){
              printf("input the %dth node of list: ");
              scanf(" %c",&tmp);
              ptr=(LNode*)malloc(sizeof(LNode));
              if(!ptr)  return 0;
              ptr->data=tmp;
              ptr->next=h;
              h=ptr;
       }
        return 1;
}

int main(int argc, char** argv){
        LNode *head, *ptr;
        if(!create(head)){
                  printf("failed.\n");
                  exit(0);
        }
        ptr=head;
        printf("print list:\n");   /*断点 1*/
        while(ptr!=NULL){
                printf("%c",ptr->data);
                ptr=ptr->next;
        }
         printf("it's end.\n");
         return 1;
}
[/code:1]

每当程序运行到“断点 1”的时候("print list:"会被打印),程序就会自动终止
请大家帮忙看看问题可能出在什么地方?

另外,堆栈、队列、二叉树的代码同样可以编译运行,但是运行之后程序不会在终端上打印出任何东西。
发表于 2003-8-11 03:50:33 | 显示全部楼层
编译时有警告吗?

[code:1]
int main(int argc, char** argv){
        LNode *head, *ptr;
        if(!create(head)){            <--------这一句
                  printf("failed.\n");
                  exit(0);
        }
[/code:1]
也许应该改为:
[code:1]
        LNode *head, *ptr;
        if(!create(&head)){            <--------这一句
                  printf("failed.\n");
                  exit(0);
        }
[/code:1]
[code:1]
int create(LNode *h){            <--------这一句
       LNode *ptr;
       int i=0;  int n=0;
       char tmp;
       h=NULL;            <--------这一句
       printf("input the number of list:\n");
       scanf("%d",&n);
       for(;i<n;i++){
              printf("input the %dth node of list: ");
              scanf(" %c",&tmp);
              ptr=(LNode*)malloc(sizeof(LNode));
              if(!ptr)  return 0;
              ptr->data=tmp;
              ptr->next=h;            <--------这一句
              h=ptr;            <--------这一句
       }
        return 1;
}
[/code:1]
改为:
[code:1]
int create(LNode **h){            <--------这一句
       LNode *ptr;
       int i=0;  int n=0;
       char tmp;
       *h=NULL;            <--------这一句
       printf("input the number of list:\n");
       scanf("%d",&n);
       for(;i<n;i++){
              printf("input the %dth node of list: ");
              scanf(" %c",&tmp);
              ptr=(LNode*)malloc(sizeof(LNode));
              if(!ptr)  return 0;
              ptr->data=tmp;
              ptr->next=*h;            <--------这一句
              *h=ptr;            <--------这一句
       }
        return 1;
}
[/code:1]
回复

使用道具 举报

 楼主| 发表于 2003-8-11 09:14:54 | 显示全部楼层
没有,并不是这样改的,不过还是谢谢这么热心
回复

使用道具 举报

发表于 2003-8-11 12:01:09 | 显示全部楼层
You can move  the "head"  pointer out of your function, and declare it as a
global variable.
Good Luck!

[code:1]
#include <stdio.h>
#include <stdlib.h>

typedef struct node{
       char data;
       struct node *next;
}LNode;

LNode *head;   /* Declare your "head" */

int create(LNode *h)  
{
       LNode *ptr;
       int i=0;  int n=0;
       char tmp;
       h=NULL;
       printf("input the number of list:\n");
       scanf("%d",&n);
       for(;i<n;i++){
              printf("input the %dth node of list: ", i);
              scanf(" %c",&tmp);
              ptr=(LNode*)malloc(sizeof(LNode));
              if(!ptr)  return 0;
              ptr->data=tmp;
              ptr->next=h;
              h=ptr;
       }
       head = h; /* let your head point to the list */
        return 1;
}

int main(int argc, char** argv){
        LNode  *ptr;
        if(!create(head)) /* Maybe this parameter is no need */
        {
                  printf("failed.\n");
                  exit(0);
        }
        ptr=head;
        printf("print list:\n");   
        while(ptr!=NULL){
                printf("%c",ptr->data);
                ptr=ptr->next;
        }
         printf("it's end.\n");
         return 1;
}
[/code:1]
回复

使用道具 举报

 楼主| 发表于 2003-8-11 22:20:12 | 显示全部楼层
[code:1]
#include <stdio.h>
#include <stdlib.h>

typedef struct node{
       char data;
       struct node *next;
}LNode;

LNode* create(LNode *h){
       LNode *ptr;
       int i=0;  int n=0;
       char tmp;
       h=NULL;
       printf("input the number of list:\n");
       scanf("%d",&n);
       for(;i<n;i++){
              printf("input the %dth node of list: ");
              scanf(" %c",&tmp);
              ptr=(LNode*)malloc(sizeof(LNode));
              if(!ptr)  return 0;
              ptr->data=tmp;
              ptr->next=h;
              h=ptr;
       }
        return h;
}

int main(int argc, char** argv){
        LNode *head, *ptr;
        if(!(head=create(head))){
                  printf("failed.\n");
                  exit(0);
        }
        ptr=head;
        printf("print list:\n");   /*断点 1*/
        while(ptr!=NULL){
                printf("%c",ptr->data);
                ptr=ptr->next;
        }
         printf("it's end.\n");
         return 1;
}

[/code:1]

我用这种方法确实行得通,我之所以那样写是因为,在程序中有一个
int insert(LNode *h, int n);
的方法,其中n是链表现有的长度,我用create(head);返回一个整型
[code:1]
int create(LNode *h){
       LNode *ptr;
       int i=0;  int n=0;
       char tmp;
       h=NULL;
       printf("input the number of list:\n");
       scanf("%d",&n);
       for(;i<n;i++){
              printf("input the %dth node of list: ");
              scanf(" %c",&tmp);
              ptr=(LNode*)malloc(sizeof(LNode));
              if(!ptr)  return 0;
              ptr->data=tmp;
              ptr->next=h;
              h=ptr;
       }
        return n;
}
[/code:1]
然后在
[code:1]int main(int argc, char** argv){}[/code:1]中
调用
[code:1]
int len=0;
len=create(head);
[/code:1]

目的就是这样的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-15 05:53 , Processed in 0.043434 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表