luomengkang 发表于 2013-5-18 11:33:30

单链表插入的算法 编译没错 可就是不能运行 求大神们 帮帮忙

# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>
/*-------------------------------创建结构类型----------------------------------*/
typedef struct Node
{
int data ;
struct Node * pNext ;
}NODE , * PNODE ;
/*-----------------------------------------------------------------------------*/

/*---------------------------------创建函数------------------------------------*/
PNODE creat_list(void) ;
void shuchu(PNODE phead);
int geshu (PNODE phead);
void paixu(PNODE phead);
void charu(PNODE phead);
/*-----------------------------------------------------------------------------*/
/*---------------------------------主函数---------------------------------*/
int main (void)
{
PNODE phead = NULL ;
int val ;
int len ;
phead =creat_list();
shuchu(phead);
len = geshu (phead);
printf ("有%d个节点\n",len);
paixu(phead);
shuchu(phead);
charu(phead);
shuchu(phead);
return 0;
}
/*------------------------------------------------------------------------*/

/*-----------------------------创建单链表函数------------------------------------*/
PNODE creat_list(void)
{
int i ;
int len ;
int val ;//临时存储的数据
PNODE phead = (PNODE)malloc(sizeof(NODE));
if ( NULL == phead )
{
printf(" 创建失败 \n");
exit(-1);
}
PNODE pTail = phead ;

printf("输入要生成节点的个数 len = \n");
scanf ("%d",&len);
for(i = 0 ; i < len ; i ++)
{

printf("请输入第%d个节点的值: ", i+1);
scanf("%d",&val);

PNODE New =(PNODE)malloc(sizeof(NODE));
if (NULL==New)
exit(-1);

New ->data = val;
pTail ->pNext = New ;
New ->pNext =NULL;
pTail = New ;

}
return phead ;
}
/*------------------------------------------------------------------------*/
/*-------------------------------输出函数-----------------------------------*/
void shuchu(PNODE phead)
{
PNODE p = phead->pNext ;
while (p != 0)
{
printf("%d\n",p->data);
p = p->pNext;
}
return;
}
/*------------------------------------------------------------------------*/

/*----------------------------------节点个数---------------------------------*/
int geshu (PNODE phead)
{
PNODE p = phead->pNext ;
int i = 0;
while (p != 0)
{

i= i+ 1;
p = p->pNext;
}
return i ;
}
/*------------------------------------------------------------------------*/

/*---------------------------------排序---------------------------------*/
void paixu(PNODE phead)
{
int i = 0 ;
int j = 0 ;
int len = 0;
int t;
PNODE p ,q ;
len = geshu (phead) ;

for (i = 0 ,p=phead ->pNext;i < len - 1 ;i ++,p=p->pNext)
for (j =i+1,q=p->pNext ; j< len ;j++,q=q->pNext)
{
   if( p->data > q->data/*a>a*/)
   {
   
    t=p->data;
    p->data=q->data;
    q->data=t;/*t=a;
    a=a;
    a=t;*/
   }
}
}
/*------------------------------------------------------------------------*/

/*------------------------------插入----------------------------------------*/
void charu(PNODE phead)
{
PNODE p = phead;



int a;


int len;
int val ;
len = geshu (phead) ;
printf("请输入要在第a个节点后插入一个节点 a = ");
scanf("%d",a);
for(a = 1 ; a <= len ; a++ )

p = p->pNext;
PNODE pNew =(PNODE)malloc(sizeof(NODE));
printf("请输入新节点的数据 val =");
scanf ("%d",val);
if(NULL!=p)
{
pNew->pNext=p->pNext;
p->pNext=pNew;
}
else if (NULL == p)
{
pNew->pNext=NULL;
p->pNext=pNew;
}



}
/*------------------------------------------------------------------------*/

熊文杰 发表于 2013-5-18 11:33:31

本帖最后由 熊文杰 于 2013-5-18 14:32 编辑

运行了一下,首先,你的插入里面
      printf("请输入要在第a个节点后插入一个节点 a = ");
      scanf("%d",a);

这里应该是scanf("%d",&a);

        printf("请输入新节点的数据 val =");
        scanf ("%d",val);
这里也是应该是scanf("%d",&val);
我继续帮你看,看完了 把改过之后的完整代码贴出来

熊文杰 发表于 2013-5-18 14:42:44

小改了你两个函数,一个创建函数,加了一句,phead-》pNext = NULL;否则你输入0时候就会崩溃。
另外插入也改了下代码如下PNODE creat_list(void)
{
        int i ;
        int len ;
        int val ;//临时存储的数据
        PNODE phead = (PNODE)malloc(sizeof(NODE));
        if ( NULL == phead )
        {
                printf(" 创建失败 \n");
                exit(-1);
        }
        //这里记得给初始值,否则创建0个结点的时候,你输出就会崩溃
        phead->pNext = NULL;
        PNODE pTail = phead ;

        printf("输入要生成节点的个数 len = \n");
        scanf ("%d",&len);
        for(i = 0 ; i < len ; i ++)
        {

                printf("请输入第%d个节点的值: ", i+1);
                scanf("%d",&val);

                PNODE New =(PNODE)malloc(sizeof(NODE));
                if (NULL==New)
                        exit(-1);

                New ->data = val;
                pTail ->pNext = New ;
                New ->pNext =NULL;
                pTail = New ;

        }

        return phead ;
}/*------------------------------------------------------------------------*/

/*------------------------------插入----------------------------------------*/
void charu(PNODE phead)
{
        PNODE p = phead;



        int a;


        int len;
        int val ;
        len = geshu (phead) ;
        printf("请输入要在第a个节点后插入一个节点 a = ");
        scanf("%d",&a);
        for(a = 1 ; a <= len ; a++ )

                p = p->pNext;
        PNODE pNew =(PNODE)malloc(sizeof(NODE));
        printf("请输入新节点的数据 val =");
        scanf ("%d",&val);

        //赋值
        pNew->data = val;
        pNew->pNext = NULL;
       
        if(NULL!=p)
        {
                pNew->pNext=p->pNext;
                p->pNext=pNew;
        }
        else if (NULL == p)
        {
                pNew->pNext=NULL;
                p->pNext=pNew;
        }
       

}
/*------------------------------------------------------------------------*/

熊文杰 发表于 2013-5-18 14:45:11

另外,楼主的插入 没有判断输入的结点号大于结点个数,也不知道 楼主是不是刻意不这么做的。

小亮1201 发表于 2013-5-18 22:17:19

遇到问题楼主可以单步调试嘛

All-惊奇的梦 发表于 2013-5-19 00:35:08

小白白一只求罩罩

luomengkang 发表于 2013-5-19 11:56:31

熊文杰 发表于 2013-5-18 14:27 static/image/common/back.gif
运行了一下,首先,你的插入里面
      printf("请输入要在第a个节点后插入一个节点 a = ");
      s ...

感谢感谢,居然败在了这小细节上去了,以后我会认真打代码的

luomengkang 发表于 2013-5-19 16:08:07

熊文杰 发表于 2013-5-18 11:33 static/image/common/back.gif
运行了一下,首先,你的插入里面
      printf("请输入要在第a个节点后插入一个节点 a = ");
      s ...

我又把删除的函数写出来了   ,也是编译成功但是 运行不了;
/*--------------------------------------删除--------------------------------*/
void shanchu(PNODE phead)
{
        PNODE p = phead ;
       
        PNODE q = NULL ;
        int length ;
       
        int a=0;
        int i ;
        length = geshu (phead);

       
        printf("请输入要删除第a个节点 a = ");
        scanf ("%d", &a);
        for (i =0 ; i < a ; i ++)
        {       
                q = p ;
                p=p->pNext;
        }
        if ( NULL != p)
        {
                q->pNext=q->pNext->pNext;
                free(p);
        }
        else if (NULL == p)
        {
                q->pNext=NULL;
                free(p);
        }
}
/*------------------------------------------------------------------------*/

熊文杰 发表于 2013-5-19 16:55:34

运行不了?你的删除函数 我这运行没什么问题。正常

luomengkang 发表于 2013-5-19 18:10:34

熊文杰 发表于 2013-5-19 16:55 static/image/common/back.gif
运行不了?你的删除函数 我这运行没什么问题。正常

那可能是我的编译器有问题吧,我这写的应该没问题吧。谢咯

bafengao 发表于 2013-5-26 13:55:22

强烈支持楼主ing……

bafengao 发表于 2013-5-27 13:43:02

我只是路过打酱油的。向你学习

bafengao 发表于 2013-5-28 14:28:41

强烈支持楼主ing……

bafengao 发表于 2013-6-2 22:01:09

好好学习天天向上

bafengao 发表于 2013-6-4 19:33:18

谢谢楼主分享

易道 发表于 2013-6-4 20:23:49

帮你顶下吧我也不懂C的链表

驻留的习惯 发表于 2014-3-15 19:53:40

路过!!!!!!!!!

y290176346 发表于 2015-9-19 16:42:52

我是来领鱼币的

鱼C工作室.YCGZS 发表于 2015-12-7 17:08:42

不是有系统检测吗

susijie0021 发表于 2015-12-10 14:18:05

:smile
页: [1]
查看完整版本: 单链表插入的算法 编译没错 可就是不能运行 求大神们 帮帮忙