在有序链表中插入数据 (40 分)
给定一批严格递增排列的整型数据,给定一个x,若x不存在,则插入x,要求插入后保持有序。存在则无需任何操作。
输入格式:
输入有两行: 第一个数是n值,表示链表中有n个数据。后面有n个数,分别代表n个数据。 第二行是要插入的数。
输出格式:
输出插入后的链表数据,以空格分开。行末不能有多余的空格。
输入样例1:
在这里给出一组输入。例如:
5 1 3 6 9 11
4
输出样例1:
在这里给出相应的输出。例如:
1 3 4 6 9 11
输入样例2:
在这里给出一组输入。例如:
5 1 3 6 9 11
3
输出样例2:
在这里给出相应的输出。例如:
1 3 6 9 11
题解
#include <stdio.h>
#include <stdlib.h>
//单链表定义
typedef struct Node{
int data;
struct Node *next;
}LNode,*LinkList;
//单链表插入
void InsertList(LinkList L,int x){
LinkList p, pp,q;
pp = (LinkList)malloc(sizeof(LNode));
pp->data = x;
for (q = L->next; q && q->data != x; q = q->next);
if(q!=NULL) return;
for (p = L; p->next && p->next->data < x; p = p->next);//当数据大于时跳出
pp->next = p->next;
p->next = pp;
}
//打印
void PrintList(LinkList L){
LinkList p = L->next;
while(p){
if(p->next!=NULL){
printf("%d ",p->data);
p = p->next;
}else{
printf("%d",p->data);
p = p->next;
}
}
}
int main(){
int n,t;
LinkList L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
if(scanf("%d",&n)==1){
for(int i=0;i<n+1;i++){
if(scanf("%d",&t)==1)
InsertList(L,t);
}
PrintList(L);
}
return 0;
}