标题:单链表的建立,请问哪错了?为什么?
只看楼主
境善
Rank: 2
等 级:论坛游民
帖 子:76
专家分:16
注 册:2012-10-29
结帖率:86.21%
已结贴  问题点数:1 回复次数:9 
单链表的建立,请问哪错了?为什么?
#include <stdio.h>
#include <malloc.h>
//数据类型
typedef struct Lnode
{
    int data;
    struct Lnode *next;

}Lnode,*LinkList;
//建立带头结点的线性表(头插法)
void creatList(LinkList L,int n)
{
    int x,i=0;
 Lnode *p;
 L=(LinkList)malloc(sizeof(Lnode));
 L->next=NULL;
 p=(Lnode *)malloc(sizeof(Lnode));
 printf("please enter the number:\n");
 while(p!=NULL&&i<=n){
     
     scanf("%d ",&x);i++;printf("%d \n",i);
     p->data=x;
     p->next=L->next;
     L->next=p;
     p=(Lnode *)malloc(sizeof(Lnode));     
   
 }
}
//删除操作
void DeleteList(LinkList L,int e)
{
    printf("aaa  ");
 Lnode *p,*pre;
 pre=L;
 p=L->next;
 while(p!=NULL){
     if(p->data==e){pre->next=p->next;free(p);p=pre->next;}
     else{
         p=p->next;pre=pre->next;}
 }
}
//打印输出

void Print(LinkList L)
{
    printf("ddd ");
    L=L->next;
    while(L!=NULL){printf("%d ",L->data);L=L->next;}

}

int main()
{
void creatList(LinkList ,int);
void DeleteList(LinkList ,int);
void Print(LinkList L);
LinkList L;
creatList(L,7);
DeleteList(L,3);
Print(L);
return 0;   
}
搜索更多相关主题的帖子: include please number 线性表 
2013-11-12 19:03
gaoxing123
Rank: 2
等 级:论坛游民
帖 子:6
专家分:14
注 册:2013-10-12
得分:1 
你写的代码有点乱,你看看这个,这个是可运行的
#include "stdio.h"
#include"stdlib.h"
#include"malloc.h"
//自定义数据类型数据类型
typedef struct Lnode
{
    int data;
    struct Lnode *next;

}Lnode,*LinkList;
//建立带头结点的线性表(头插法)
void creatList(LinkList L,int n)
{
    int x,i=0;
    LinkList p;
    p=(LinkList)malloc(sizeof(Lnode));
    printf("please enter %d the number:\n",n);
    while(p!=NULL&&i<n)
    {
        scanf("%d",&x);
         i++;
         p->data=x;
         p->next=L->next;
         L->next=p;
         p=(LinkList)malloc(sizeof(Lnode));
    }
}
//删除操作。删除l链表中指定的数据e
void DeleteList(LinkList L,int e)
{
    printf("///////////////////////////////////////////////////////////////////////////////////\n ");
   LinkList pre=L;
   LinkList p=L->next;
    while(p!=NULL)
    {
         if(p->data==e)
         {
             pre->next=p->next;
             free(p);
             printf("删除指定数据%d成功\n",e);
             break;
            // p=pre->next;
         }
         else//没找到,指针继续后移
         {
             pre=p;
             p=p->next;
         }
    }
     if(NULL==p)
     {
        printf("链表中没有该数据元素\n");
    }
}
//打印输出
void Print(LinkList L)
{
    printf("///////////////////////////////////////////////////////////////////////////\n ");
    L=L->next;
    while(L!=NULL)
    {
        printf("%d ",L->data);
        L=L->next;
    }
}

int main()
{
    void creatList(LinkList ,int);
    void DeleteList(LinkList ,int);
    void Print(LinkList L);
    LinkList L;//头结点
    L=(LinkList)malloc(sizeof(Lnode));
    L->next=NULL;
    creatList(L,7);//创造链表
    printf("创建链表成功\n");
    DeleteList(L,3);//删除链表
    Print(L);//删除链表
    return 0;   
}
2013-11-12 20:09
境善
Rank: 2
等 级:论坛游民
帖 子:76
专家分:16
注 册:2012-10-29
得分:0 
回复 2楼 gaoxing123
嗯嗯,谢谢!我又改了一下,可是为什么我需要输入8个数据才能输出删除3后的链表,而且最后一个输入的数字不在链表之内
#include <stdio.h>
#include <malloc.h>
//数据类型
typedef struct Lnode
{
    int data;
    struct Lnode *next;

}Lnode,*LinkList;
//建立带头结点的线性表(头插法)
void creatList(LinkList L,int n)
{
    int x,i=0;
 Lnode *p;
 p=(Lnode *)malloc(sizeof(Lnode));
 printf("please enter the number:\n");
 while(p!=NULL&&i<n){
     
     scanf("%d ",&x);
     i++;
     p->data=x;
     p->next=L->next;
     L->next=p;
     p=(Lnode *)malloc(sizeof(Lnode));     
   
 }

}
//删除操作
void DeleteList(LinkList L,int e)
{

 Lnode *p,*pre;
 pre=L;
 p=L->next;
 while(p!=NULL){
     if(p->data==e){pre->next=p->next;free(p);p=pre->next;}
     else{p=p->next;pre=pre->next;}
 
 }
 if(p==NULL) printf("无所删数据!");
}
//打印输出

void Print(LinkList L)
{
printf("///////////////////////////////////////////////////////////////////////////\n ");
    L=L->next;
    while(L!=NULL){printf("%d ",L->data);L=L->next;}

}

int main()
{
void creatList(LinkList ,int);
void DeleteList(LinkList ,int);
void Print(LinkList L);
LinkList L;
L=(LinkList)malloc(sizeof(Lnode));
L->next=NULL;
creatList(L,7);
DeleteList(L,3);
Print(L);
return 0;   
}
2013-11-12 22:20
于雷
Rank: 1
等 级:新手上路
帖 子:6
专家分:8
注 册:2013-11-12
得分:1 
回复 楼主 境善
我c也学的不是很好,问题很简单,就是scanf(“%d ”,&x)中的%d后边多了一个空格,但具体为什么我也没查到,如果你查到了可以告诉我。还有你的建立带头节点的方法应该注意一下,一般是用一个函数建立头节点
LinkList createFirst()
{
    LinkList L;
    if((L = (Lnode *)malloc(sizeof(Lnode))) == NULL)
    {
        printf("fail");
    }
    else
        return L;
}
像这样。还有虽然你的删除功能可以实现,但代码逻辑稍微有问题,可以看看数据结构的知识规范一下链表的各种操作。希望能帮助你。
2013-11-13 08:43
于雷
Rank: 1
等 级:新手上路
帖 子:6
专家分:8
注 册:2013-11-12
得分:0 
回复 4楼 于雷
补充一下,你的main函数中的开头三个函数声明,在这里是重复的,如果你的函数是写在main函数的前面,其作用相当于你的三个声明
2013-11-13 08:46
于雷
Rank: 1
等 级:新手上路
帖 子:6
专家分:8
注 册:2013-11-12
得分:0 
回复 3楼 境善
#include<stdio.h>
main()
{   
int a;
printf("input the data\n");
scanf("%d\n",&a);//这里多了一个回车符\n
    printf("%d",a);
return 0;
}
结果要输入两个数程序才结束,而不是预期的一个。why?
原因:用空白符结尾时,scanf会跳过空白符去读下一个字符,所以你必须再输入一个数。这里的空白符包括空格,制表符,换行符,回车符和换页符。所以如果你用scanf("%d   ",&a)也会出现同样的问题。
解决方法:这种错误大多是输入的时候不小心,多注意一点就好了。这种问题也不好检查,编译没有问题,一个空格也不容易看出来。当你的程序出现上面的问题时,自己对照检查一下就可以了。
almost there
2013-11-13 09:26
xufan
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:232
专家分:804
注 册:2008-10-20
得分:1 
给你改了下哦。
程序代码:
#include <stdio.h>
#include <malloc.h>
//数据类型
typedef struct Lnode
{
    int data;
    struct Lnode *next;
}Lnode,*LinkList;
void creatList(LinkList& ,int);//
void DeleteList(LinkList& ,int);//
void Print(LinkList L);
//建立带头结点的线性表(头插法)
void creatList(LinkList& L,int n)//
{
    int x,i=0;
    Lnode *p;
    L=(LinkList)malloc(sizeof(Lnode));
    L->next=NULL;
    LinkList head = L;//
    p=(Lnode *)malloc(sizeof(Lnode));
    printf("please enter the number:\n");
    while(p!=NULL&&i++<n){
        scanf("%d",&x);//
        p->data=x;
        p->next = NULL;//
        head->next = p;
        head = p;
        //p->next=L->next;
        //L->next=p;
        p=(Lnode *)malloc(sizeof(Lnode));   
    }
}
//删除操作
void DeleteList(LinkList& L,int e)
{
    printf("aaa  ");
    Lnode *p,*pre;
    pre=L;
    p=L->next;
    while(p!=NULL){
        if(p->data==e){pre->next=p->next;free(p);p=pre->next;}
        else{
            p=p->next;pre=pre->next;}
    }
}
//打印输出
void Print(LinkList L)
{
    printf("ddd ");
    L=L->next;
    while(L!=NULL){printf("%d ",L->data);L=L->next;}
}
int main()
{
    LinkList L = NULL; //
    creatList(L,7);
    DeleteList(L,3);
    Print(L);
    return 0;  
}


~~~~~~我的明天我知道~~~。
2013-11-13 10:42
境善
Rank: 2
等 级:论坛游民
帖 子:76
专家分:16
注 册:2012-10-29
得分:0 
回复 6楼 于雷
恩恩,非常感谢!讲解很清楚!
2013-11-13 18:27
境善
Rank: 2
等 级:论坛游民
帖 子:76
专家分:16
注 册:2012-10-29
得分:0 
回复 7楼 xufan
恩恩!谢谢!麻烦了
2013-11-13 18:28
中国电信
Rank: 1
等 级:新手上路
帖 子:16
专家分:9
注 册:2013-10-20
得分:1 
这个论坛的人真是好心啊
2013-11-13 19:44



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-423430-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.049724 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved