VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 995|回复: 6

尾插法建立动态链表

[复制链接]
07_avatar_middle
在线会员 Acher陈 发表于 2018-3-3 17:27:03 | 显示全部楼层 |阅读模式
源代码:
#include<stdio.h>
#include<malloc.h>
#define length sizeof (struct node)
struct node//创建一个node新类型;
{
        int num;//数据域;(保存数据)
        struct node *next;//指针域;(保存下一个结点的地址)
};
int n;
struct node *creatlist()//创建一个struct node类型,返回该类型指针的creatlist函数;
{
        struct node *head=NULL, *new_point, *old_point;
        new_point = old_point = (struct node * )malloc(length);//动态分配一个struct node类型大小的内存,并且将首地址传回给new_point和old_point指针;
        scanf("%d", &new_point->num);
        while (new_point->num!=0)
        {
                n += 1;
                if (n==1)
                {
                        head = new_point;
                }
                else
                {
                        old_point->next = new_point;

                }
                old_point = new_point;
                new_point = (struct node *)malloc(length);
                scanf("%d", &new_point->num);
        }
        old_point->next = NULL;//尾结点指针域为空;
        free(new_point);//释放新的结点;

        return head;//返回头指针;
}
void print(struct node *head)//打印链表;
{

        struct node *p;
        p = head;
        /*for (p; p->next != NULL;p=p->next)
        {
                printf("%d\t", p->num);
        }
                printf("\n");*/
        do //循环语句,输出链表;
        {
                printf("%d\t", p->num);
                p = p->next;
        } while (p->next!=NULL);
        printf("\n");

}
void main()
{
        struct node *p;
        p = creatlist();
        print(p);
}

为什么我在键盘输入1 2 3 ;输出只有1 2 呢?
如果我想完整的表达出来这个链表,输出函数应该怎样修改呢?  谢谢




上一篇:学习结构体时遇到的问题
下一篇:《实用C++》第26课 枚举类型及定义新的类型名字

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

01_avatar_middle
online_admins admin 发表于 2018-3-4 11:34:11 | 显示全部楼层
打印函数 print 的问题,你的 do-while 循环中止条件的判断是:
do //循环语句,输出链表;
{
        printf("%d\t", p->num);
        p = p->next;
} while (p->next!=NULL);

也就是说当 p->next == NULL 的时候循环就会跳出,那么我问你,链表的最后一个结点的 p->num = 3,但是他的 p->next 的值为 NULL,所以你最后的这个结点根本没打印出来!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

07_avatar_middle
ico_lz  楼主| Acher陈 发表于 2018-3-4 22:38:28 | 显示全部楼层
admin 发表于 2018-3-4 11:34
打印函数 print 的问题,你的 do-while 循环中止条件的判断是:
do //循环语句,输出链表;
{

好的,谢谢;

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

07_avatar_middle
ico_lz  楼主| Acher陈 发表于 2018-3-4 22:43:07 | 显示全部楼层
admin 发表于 2018-3-4 11:34
打印函数 print 的问题,你的 do-while 循环中止条件的判断是:
do //循环语句,输出链表;
{

还有一个问题
下面时源代码:
#include<stdio.h>
#include<malloc.h>
#define LEN sizeof(struct node)
struct node *del(struct node *head, int del_num);
struct node *crearlist();
void print(struct node *head);
struct node *insert(struct node *head, int ins_num);
int n;
struct node
{
        int data;
        struct node * next;

};
struct node *crearlist()
{
        struct node *head, *p, *q;
        n = 0;
        p = q = (struct node*)malloc(LEN);
        scanf_s("%d", &p->data);
        head = NULL;
        while (p->data!=0)
        {
                n = n + 1;
                if (n == 1)
                {
                        head = p;
                }
                else
                {
                        q->next = p;
                }
                q = p;
                p = (struct node*)malloc(LEN);
                scanf("%d", &p->data);
        }
        q->next = NULL;
        free(p);
        return (head);

}
void print(struct node *head)
{

        struct node *p;
        printf("\n这儿有%d个结点", n);
        p = head;
        if (head=NULL)
        {
                printf("这是空链表");
        }
        else
        {
                do
                {
               
                        printf("%d\t", p->data);
                        p = p->next;
                } while (p!=NULL);
        }
}
struct node *insert(struct node *head, int ins_num)
{
        struct node *p, *q1, *q2;
        q1 = head;
        p = (struct node *)malloc(LEN);
        p->data = ins_num;
        if (head=NULL)
        {
                head = p;
                p->next = NULL;
        }
        if (p->data<head->data)
        {
                head = p;
                p->next = q1;
        }
        else
        {
                while ((p->data>=q1->data)&&(q1!=NULL))
                {
                        q2 = q1;
                        q1 = q1->next;
                }
                q2->next = p;
                p->next = q1;

        }
        n += 1;

        return (head);
}
struct node *del(struct node *head, int del_num)
{
        struct node *q1, *q2;
        q1 = head;
        if (head=NULL)
        {
                printf("错误,空链表");
        }
        else
        {
                while ((del_num != q1->data) && (q1->next != NULL))
                {
                        q2 = q1;
                        q1 = q1->next;
                }
                if (del_num==q1->data)
                {
                        if (q1==head)
                        {
                                head = q1->next;
                        }
                        else
                        {
                                q2->next = q1->next;
                        }
                        free(q1);
                        n -= 1;
                }
                printf("未找到结点");
        }

        return (head);
}

void main()
{
        struct node *head;
        int ins_num, del_num;
        printf("请输入链表元素");
        head = crearlist();
        print(head);
        printf("输入插入元素");
        scanf("%d", &ins_num);
        while (ins_num!=0)
        {
                head = insert(head, ins_num);
                print(head);
                printf("输入插入元素");
                scanf("%d", &ins_num);

        }
        printf("请输入删除元素");
        while (del_num != 0)
        {
                head = del(head, del_num);
                print(head);
                printf("输入插入元素");
                scanf("%d", &del_num);

        }
}

我在visual studio 2013运行到插入元素时就会报错,选择调试,界面如下:
尾插法建立动态链表

错误在
if (p->data<head->data)
        {
                head = p;
                p->next = q1;
        }

请问这是什么原因呢?怎么解决呢?谢谢

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

01_avatar_middle
online_admins admin 发表于 2018-3-4 22:49:03 | 显示全部楼层
Acher陈 发表于 2018-3-4 22:43
还有一个问题
下面时源代码:
#include

调试界面都提示你喽,head 指针已经是 NULL 了,你还去引用他的 data 成员,肯定报错了

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

07_avatar_middle
ico_lz  楼主| Acher陈 发表于 2018-3-5 16:32:04 | 显示全部楼层
admin 发表于 2018-3-4 22:49
调试界面都提示你喽,head 指针已经是 NULL 了,你还去引用他的 data 成员,肯定报错了

嘿嘿嘿嘿  谢谢大哥

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

07_avatar_middle
ico_lz  楼主| Acher陈 发表于 2018-3-5 16:39:39 | 显示全部楼层
admin 发表于 2018-3-4 22:49
调试界面都提示你喽,head 指针已经是 NULL 了,你还去引用他的 data 成员,肯定报错了

我找到问题了  是head=NULL错了  应该是head==NULL

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-12-10 13:27

Powered by Discuz! X3.4

© 2009-2018 cctry.com

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