题目描述
给定一个递增整数序列和某个整数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
本题很忌讳使用两个指针同时指向同一动态内存的做法,如下:
void InsNode(LinkList PHead,DataType data)
{
Node *p;
Node *s;
Node *q;
p=PHead;
q=PHead; //此处p和q同时指向链表头结点,从思维上来说感觉没问题
p=p->Next; //这样很容易产生误导,实际上这样做会出现一个严重问题
while(p->Next!=NULL&&p->Data<data)
{ //两个指针变量如果指向同一动态内存,一个指针结束生命期释放内存
p=p->Next;//另一指针所指地址虽被释放,但该指针不等于NULL而是随机值
q = q->Next;//此举十分容易引发野指针,导致内存破坏
}
if (p->Data > data)
{
s=(Node*)malloc(sizeof(Node));
s->Data=data;
s->Next=q->Next;
q->Next=s;
}
else
{
s = (Node*)malloc(sizeof(Node));
s->Data = data;
p->Next = s;
s->Next = NULL;
}
}
具体代码如下:
#include <stdio.h>
#include<stdlib.h>
typedef struct Node{
int data;
struct Node *next;
}Node,*LinkList;
//链表初始化
void InitList(LinkList *P){
*P = (LinkList)malloc(sizeof(Node));
if(*P==NULL){
return;
}
(*P)->next=NULL;
}
//链表插入(尾插法)
void CFromBack(LinkList P,int n){
int data,i;
Node *p,*s;
s=P;
for(i=0;i<n;i++){
scanf("%d",&data);
p=(LinkList)malloc(sizeof(Node));
p->data=data;
p->next=s->next;
s->next=p;
s=p;
}
}
//在链表中插入数据
LinkList function(LinkList P,int m){
Node *p,*s;
p=P;
s=(LinkList)malloc(sizeof(Node));
s->data=m;
s->next=NULL;
while(P->next!=NULL&&P->next->data<m){ //寻找插入位置
P=P->next;
}
s->next=P->next;
P->next=s;
return p;
}
//打印链表
void PrintList(LinkList P){
Node *p;
p=P;
while(p->next!=NULL){
p=p->next;
printf("%d ",p->data);
}
}
int main(){
int M,N;
LinkList L;
InitList(&L);
scanf("%d %d",&N,&M);
CFromBack(L,N);
L=function(L,M);
PrintList(L);
}
版权声明:本文为weixin_45949928原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。