| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1859 人关注过本帖
标题:关于在头部插入结点的问题
只看楼主 加入收藏
bjut_Allen
Rank: 9Rank: 9Rank: 9
来 自:平乐园工业技术学校
等 级:蜘蛛侠
威 望:8
帖 子:323
专家分:1223
注 册:2016-10-16
结帖率:95.45%
收藏
已结贴  问题点数:5 回复次数:11 
关于在头部插入结点的问题
截取了插入函数,在中间和结尾可以插入,但是头部不行,哪有问题。
链表中数据是按从小到大排列的

NODE* insert_sort(NODE* h, int x)
{
      NODE *p,*q,*s;
      p=h;
      q=p;
      int i;
      s=(NODE*)malloc(sizeof(NODE));
      s->data=x;
      if(x<p->data)    //在头部插入不能成功
      {
          s->next=p;
          h=s;
          return h;
      }
      for(i=0;i<NUM-1;i++)     //在中间插入
      {
          p=p->next;
         if(x<p->data)
         {
            s->next=q->next;
            q->next=s;
            break;
         }
         else
                 q=p;
      }
      if(x>p->data)    //在尾部插入
      {
          p->next=s;
      s->next=NULL;
      }  
      return h;
}
搜索更多相关主题的帖子: return 
2016-12-10 13:52
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
这部分代码看不出有问题~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-10 14:17
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
代码看似没问题
这样测试一下:
void test()
{
    NODE *h = (NODE*)malloc(sizeof(NODE));
    h->data = 5;
    h->next = NULL;
    h = insert_sort(h, 3);
    h = insert_sort(h, 1);
    printf("%d\n", h->data);
    printf("%d\n", h->next->data);
    printf("%d\n", h->next->next->data);
    free(h->next->next);
    free(h->next);
    free(h);
}
2016-12-10 14:19
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
对哦,没考虑x==p->date的情况,如果x==p->date,则不进行插入处理~

没理解好程序~你试试全部都输入1,保证插入1时还是6个节点

[此贴子已经被作者于2016-12-10 15:03编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-10 14:21
bjut_Allen
Rank: 9Rank: 9Rank: 9
来 自:平乐园工业技术学校
等 级:蜘蛛侠
威 望:8
帖 子:323
专家分:1223
注 册:2016-10-16
收藏
得分:0 
回复 4楼 九转星河
如果x=p->data可以插到第一个结点后面

Code is my life.
2016-12-10 14:27
bjut_Allen
Rank: 9Rank: 9Rank: 9
来 自:平乐园工业技术学校
等 级:蜘蛛侠
威 望:8
帖 子:323
专家分:1223
注 册:2016-10-16
收藏
得分:0 
整个贴出来

#include <stdio.h>
#include <stdlib.h>
#define NUM 6
typedef struct node{
    int data;
    struct node *next;
}NODE;
NODE* create_rear(int a[], int n);
NODE* insert_sort(NODE* h, int x);
void output(NODE *h);
int main()
{
    int a[NUM];
    int i,x;
    NODE *h;
    printf("输入数组6个元素的值。");
    for(i=0;i<NUM;i++){
     scanf("%d",&a[i]);
    }
    h=create_rear(a,NUM);
    printf("此链表各个结点的数据域为:");
    output(h);
    printf("\n输入要插入的数据x:");
    scanf("%d",&x);
    insert_sort(h,x);
    printf("插入后链表各个结点的数据域为:");
    output(h);
    return 0;
}
NODE* create_rear(int a[], int n)
{
     NODE *h=NULL,*p,*q;
     int i;
     for(i=0;i<NUM;i++)
     {
     p=(NODE*)malloc(sizeof(NODE));
     p->data=a[i];
        if(h==NULL)
        {
           h=p;
           q=p;
        }
        else
        {
           q->next=p;
           q=p;
        }
     }
     q->next=NULL;
     return h;
}
void output(NODE *h)
{
    NODE *p;
    p=h;
    while(p!=NULL)
    {
       printf("%4d",p->data);
       p=p->next;
    }
}
NODE* insert_sort(NODE* h, int x)
{
      NODE *p,*q,*s;
      p=h;
      q=p;
      int i;
      s=(NODE*)malloc(sizeof(NODE));
      s->data=x;
      if(x<p->data)
      {
          s->next=p;
          h=s;
          return h;
      }
      for(i=0;i<NUM-1;i++)     //在中间插入
      {
          p=p->next;
         if(x<p->data)
         {
            s->next=q->next;
            q->next=s;
            break;
         }
         else
                 q=p;
      }
      if(x>p->data)    //在尾部插入
      {
          p->next=s;
      s->next=NULL;
      }
      return h;
}

Code is my life.
2016-12-10 14:43
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:3 
h=insert_sort(h,x);//返回值要赋给h

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-10 14:59
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:2 
简单写个类似的

/*
    链表插入排序
*/
#include <stdio.h>
#include <stdlib.h>

typedef struct Node
{
    int data;
    struct Node * next;
} NODE, *PNODE;

NODE *insert_sort(NODE *h, int x)       //参数:首指针,插入值
{
    NODE *p, *q, *s;
    p = h;
    q = NULL;
    s = (NODE*)malloc(sizeof(NODE));    //新记录
    s->data = x;
    s->next = NULL;
    while (p)
    {
        if (x < p->data)                //升序
        {
            s->next = p;
            break;
        }
        q = p;
        p = p->next;
    }
    if (q)                      //如果上一个记录存在
        q->next = s;            //新记录接上一个记录
    else                        //否则
        h = s;                  //新记为首记录
    return h;                   //返回首地址
}

void _list(NODE *h)
{
    NODE *p=h;
    while (p)
    {
        printf("%d\n", p->data);
        p = p->next;
    }
}

void _free(NODE *h)
{
    NODE *p=h, *q;
    while (p)
    {
        q = p->next;
        free(p);
        p = q;
    }
}

void _test()
{
    NODE *h;
    h = insert_sort(NULL, 5);
    h = insert_sort(h, 2);
    h = insert_sort(h, 3);
    h = insert_sort(h, 2);
    h = insert_sort(h, 1);
    h = insert_sort(h, 4);
    h = insert_sort(h, 6);
    h = insert_sort(h, 4);
    _list(h);
    _free(h);
}

main()
{
    _test();
}


[此贴子已经被作者于2016-12-10 16:21编辑过]

2016-12-10 15:56
bjut_Allen
Rank: 9Rank: 9Rank: 9
来 自:平乐园工业技术学校
等 级:蜘蛛侠
威 望:8
帖 子:323
专家分:1223
注 册:2016-10-16
收藏
得分:0 
回复 7楼 九转星河
对对对!!!!

Code is my life.
2016-12-10 17:44
bjut_Allen
Rank: 9Rank: 9Rank: 9
来 自:平乐园工业技术学校
等 级:蜘蛛侠
威 望:8
帖 子:323
专家分:1223
注 册:2016-10-16
收藏
得分:0 
回复 8楼 吹水佬
受教了

Code is my life.
2016-12-10 17:45
快速回复:关于在头部插入结点的问题
数据加载中...
 
   



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

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