作业帮 > 综合 > 作业

C语言中编写两个函数我是新手,最近学到单向链表了,有一个疑惑.比如,假设编写函数creat是建立一个带有头结点的链表,编

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/13 18:13:03
C语言中编写两个函数
我是新手,最近学到单向链表了,有一个疑惑.比如,假设编写函数creat是建立一个带有头结点的链表,编写函数take是顺序输出单向链表各结点数据的内容.
函数creat
struct list
{char data;
struct list * next;
};
SLIST *creat()
{ int c;
 SLIST *h,*s,*r;
 h=(SLIST *)malloc(sizeof(SLIST));    /*生成头结点*/
 r=h;                 /*r指向当前表尾*/
 scanf(“%d”,&c)          /*读入数据*/
 while(c!=1)              /*未读到数据结束标志时进入循环*/
 { s=(SLIST *)malloc(sizeof(SLIST));  /*生成一个新结点*/
  s->data=c            /*读入的数据存入新结点的data域*/
  r->next=s:           /*新结点连到表尾*/
  r=s:               /*r指向当前表尾*/
  scanf(“%d”,&c);        /*读入数据*/
 }
 r->next=‘\0’;          /*置链表结束标志*/
 return h;             /*返回表头指针*/:
}
函数take:
void take(SLIST *head)
{ SLIST *p; .
 p=head->next;            /*p指向头结点后的第一个结点*/
 if(p==‘\O’)
  printf(“Linklist is null!\n”);    /*链表为空(只有头结点)*/
 else                  /*链表非空*/
  {printf(“head”);
   do
    {printf(“->%d”,p->data);  /*输出当前结点数据域中的值*/
     p=p->next;         /*p指向下一个结点*/
    }
  while(p!=‘\O’);           /*未到链表尾,继续循环*/
   printf(“->end\n”);
  }
我想问的就是能不能在一个程序里面编写上面两个函数,然后在主函数里面实现先建立再输出呢.或者不需要编写函数?
上面的SLIST代表 struct list.如果可以怎么编写,直接在把上面两个函数写上,最后补上如下程序
void main()
{
struct list *pig;
pig=creat();
take(pig);

运行了就崩溃,哪里错了呢.讲会了加50分.关于形参实参,传值传址我懂的
当然可以的
再问: 请问怎么编写呢
再答: 最简单的使用一个 .c 主文件就可以了 比如像这样的形式: #include // 定义结构体 struct list { .... } //定义函数 struct list* Create(...) { ... } void take(...) { .. .} // 主函数 int main() { struct list *p = Create(); take(p); return 0; } 这样就可以了啊。 -------------------------- 我刚准备说这个问题的,因为你使用了malloc 函数,你的链表是动态创建的。所以程序结束之前要释放。你还要写一个 delete 函数。 像这样的形式:void delete(struct list * p); 你自己实现怎么在里面调用free释放你创建的链表,我就不写了。 ------------------------------ 还有,之前没有看你的函数具体实现,create 和 take这两个函数都有问题。 ------------------------------------ 哎,看不下去了,本来不想写的,但是另外一位同学虽然说了很多 但是代码也是个错的。 这不是误导青少年么? 少年,你等一下,我给你写一个新的,我将在程序里指出你们的错误。 -------------------------------- 少年,已经给你写好了,但是字数限制不让继续粘贴了,你在这接一个追问,我再发。
再问: 上面ququqiqi同学的我已经运行出来了。你发个对比看看把
再答: struct List { int data; // 注意我这里使用的是int型,当然char也可以,但是用int演示方便一点 struct List* pNext; }; struct List* Create() { // 定义临时数据变量,保存输入的数字 int temp; // 分别定义头节点,上一个节点,下一个节点指针 struct List* head, *prev, *next; head = NULL; // 初始化为空 scanf("%d", &temp); // 先输入一个数字 while (temp) // 判断输入的数字是否为0 { if (NULL == head) // 若头节点是空,则创建头节点 { head = (struct List*)malloc(sizeof(struct List)); head->data = temp; // 在你的程序中,没有给头节点中的data赋值 head->pNext = NULL; prev = head; } else // 否则创建下一个节点 { next = (struct List*)malloc(sizeof(struct List)); next->data = temp; next->pNext = NULL; prev->pNext = next; // 上一个节点的下一个节点等于新创建的节点 prev = next; // 到下次循环的时候,新创建的节点已经成为上一个节点 } scanf("%d", &temp); } return head; } void PrintList(struct List* head) { // 在你的take函数中,第一句p=head->next;有问题。 // 因为如果传进来的head本身为空的话,那么head->next将不存在,会引发异常。 // 你应该首先就拿head判断是否为空 // 并且你使用p==‘\O’这样的语句判断指针是否为空,本身没有错误,而且也是对的。 // 因为'\0'的值等于0, NULL的值也等于0,所以你这样写p=='\0',p==0,p==NULL都没有错。 // 但是为了直观,建议这样写:NULL == p // 至于你的printf逻辑,说实话没看懂,写的也不对。 printf("----------------\n"); while (head) { printf("%d ", head->data); head = head->pNext; } printf("\n"); } // 最后就是这个free关键的函数不能遗漏,不释放的话将在程序结束的时候崩溃。 void FreeList(struct List* head);