回 帖 发 新 帖 刷新版面

主题:这里是具体的例子。

要求建立一个单链表,其数据类型为
            typedef struct{
         char     *id;
         char     *name;
         int              age;
        }ELEMTYPE; 
    要求能输入两个元素并显示输出结果。
    下面是我的程序,实在不知道错在什么地方。
#include <stdio.h>
#include <string.h>
#include <malloc.h>
void main()
{  typedef struct{
    char     *id;
    char    *name;
    int     age;
        }ELEMTYPE;          /*单链表数据类型*/
   struct Node;                        /*单链表节点类型*/
   typedef struct Node *PNode;        /*单链表节点结构*/
   struct Node{
    ELEMTYPE    info;
    PNode        link;
        };
   typedef struct Node *LinkList;      /*单链表类型*/
   int i;
   PNode p,q;
   LinkList llist=(LinkList)malloc(sizeof(struct Node));                         /*申请表头节点空间*/
   if(llist)        p=llist;
   else             printf("out of flow!!");    /*判断是否申请成功*/
   for(i=0;i<2;i++){     /*依次向单链表中输入信息*/
    printf("Enter xxx's information(id,  name,  age):\n");
    fflush(stdin);    /*清除缓存区中的回车符,使gets()函数能正确运行*/
    gets(p->info.id); /*gets()函数只以回车符作为停止标志*/
    gets(p->info.name);
    scanf("%d",&p->info.age);
    p->link=(PNode)malloc(sizeof(struct Node));
    if(p->link)    p=p->link;
    else    printf("out of flow!!");    }
   p->link=NULL;
   p=NULL;

   printf("ID             NAME            AGE\n");
   printf("----------------------------------\n");
   q=llist;
   while(q){       
    printf("%-12s%-15s-%-5d\n",q->info.id,q->info.name,q->info.age);
    q=q->link;
            }/*依次输出单链表中的信息*/
  

  }

回复列表 (共2个回复)

沙发

1.你写代码的风格很糟.
2.ELEMTYPE的id,name都是指针,你还未为其分配内存就像其所指地址处进行写入
是很危险的,其实id,name用数组表示更好.
3.你分配的内存空间没有用free来释放掉
4.结构的定义不要写在main中要好一些.

板凳

嗯,楼上的建议非常中肯,先谢过了,我又改了一遍,看看怎么样。代码如下:
#include <stdio.h>
 typedef struct{
    char     *id;
    char    *name;
    int     age;
        }ELEMTYPE;
 typedef ELEMTYPE *PELEMTYPE;                  /*单链表数据类型*/
 struct Node;                       /*单链表节点类型*/
 typedef struct Node *PNode;        /*单链表节点结构*/
 struct Node{
    ELEMTYPE     *info;
    PNode         link;
        };
 typedef struct Node *LinkList;      /*单链表类型*/
 /*创建带头节点的空链表&申请一个节点空间*/
 LinkList creatNullList_link(void){
    LinkList llist=(LinkList)malloc(sizeof(struct Node));                     /*申请表头节点空间*/
    if(llist)    llist->link=NULL;
    else          printf("Out of flow!\n");/*创建失败*/
    return(llist);
}
 /*为ELEMTYPE类型的变量申请空间*/
 PELEMTYPE creatELEM_elem(void){
    PELEMTYPE element=(PELEMTYPE)malloc(sizeof(ELEMTYPE));
    if(element)         return(element);
    else                printf("Out of flow!\n");
    return(NULL);
}
 /*释放链表空间*/
 void  deleteList_link(LinkList llist){
    PNode p,q;
    p=llist;
    while(p){
        q=p->link;
        free(p);
        p=q;
    }
}
void main(){
   int i;
   LinkList llist;
   PNode p,q;
   llist=creatNullList_link(); /*创建带头节点的空链表*/
   p=llist->link;
   for(i=0;i<2;i++){
    p=creatNullList_link();/*申请一个节点空间*/
    p->info=creatELEM_elem();/*为ELEMTYPE类型的变量申请空间*/
    printf("Enter xxx's information(id,  name,  age):\n");
    fflush(stdin);
    gets(p->info->id);
    gets(p->info->name);
    scanf("%d",&p->info->age);
    p=p->link;
    }
   printf("ID             NAME            AGE\n");
   printf("----------------------------------\n");
   q=llist->link;
   while(q){
    printf("\n%-12s%-15s-%-5d\n",q->info->id,q->info->name,q->info->age);
    q=q->link;
            }
   deleteList_link(llist);  /*释放链表空间*/


  }

我来回复

您尚未登录,请登录后再回复。点此登录或注册