按值插入有序单链表,使之依旧有序

trawi 2017-05-26 09:29:52
又是考试系统不能通过 诶
题目内容:
给定一个递增整数序列和某个整数M,构造出此递增序列的链表,
并创建以M为值的新结点插入到链表中,使其结果序列依然保持递增顺序。
输入描述
每个输入包含一个测试用例,第1行 长度N(任意 long int范围内的正整数)和 待插入的整数M;
第2行 N个递增的整数代表原递增数列。
输出描述
根据此递增数列,构造出此递增链表,然后将M插入到链表中,输出插入后的链表对应的数列。
数字间隔一个空格,但末尾不能有空格。
输入样例
6 2
-10 -3 1 5 9 30
输出样例
-10 -3 1 2 5 9 30
#include<stdio.h>
#include<malloc.h>
typedef struct Node
{
int data;
struct Node *next;
}Node,*LinkList;
void InsertList(LinkList *L,int m)
{
Node *t,*s;
s=*L;
while(s->next->data<m) s=s->next;
t=(Node*)malloc(sizeof(Node));
t->data=m;
t->next=s->next;
s->next=t;
}
void Print(LinkList L)
{
Node *p;
p=L->next;
while(p->next)
{
printf("%d ",p->data);
p=p->next;
}printf("%d",p->data);
}
int main()
{
LinkList L;
int i,a,m,n;
Node *last,*p;
L=(LinkList)malloc(sizeof(Node));
L->data=0;
L->next=NULL;
last=L;
//输入个数和待插入数
scanf("%d %d",&n,&m);
//输入序列
for(i=0;i<n;i++)
{
scanf("%d",&a);
p=(Node*)malloc(sizeof(Node));
p->data=a;
p->next=NULL;
last->next=p;
last=p;
}
InsertList(&L,m);
Print(L);
return 0;
}

...全文
1001 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzm_cn01 2017-05-27
  • 打赏
  • 举报
回复
while(s->next->data<m) s=s->next; //这里s->next可能为空,s->next->data这样访问会崩溃的
s->next && s->next->data < m;//应该改成这样
自信男孩 2017-05-27
  • 打赏
  • 举报
回复
#include <stdio.h>
#include<malloc.h>


typedef struct Node
{
    int data;
    struct Node *next;
}Node,*LinkList;

void InsertList(LinkList *L,int m)
{
    Node *t,*s;
    s = *L;


    while (s->next && s->next->data < m) {
        s = s->next;
    }

    //while(s->next->data < m)
    //    s = s->next;
    t = (Node *)malloc(sizeof(Node));
    t->data = m;
    t->next = s->next;
    s->next = t;
}
void Print(LinkList L)
{
    Node *p;
    p = L->next;
    while(p->next)
    {
        printf("%d ",p->data);
        p = p->next;
    }
    printf("%d\n", p->data);
}
int main()
{
    LinkList L;
    int i,a,m,n;
    Node *last,*p;
    L=(LinkList)malloc(sizeof(Node));
    L->data = 0;
    L->next = NULL;
    last = L;
    //输入个数和待插入数
    scanf("%d%d", &n, &m);
    //输入序列
    for(i=0;i<n;i++)
    {
        scanf("%d",&a);
        p=(Node*)malloc(sizeof(Node));
        p->data=a;
        p->next=NULL;
        last->next=p;
        last=p;
    }
    InsertList(&L,m);
    Print(L);

    return 0;
}
  while (s->next && s->next->data < m) {
        s = s->next;
    }
//对比一下
    //while(s->next->data < m)
    //    s = s->next;
若不判断s->next是否为NULL,那么s->next->data < m就可能导致段错误。因为s->next可能为NULL
sleep_s 2017-05-27
  • 打赏
  • 举报
回复
这个程序不是可以实现么?

69,370

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧