题目描述
建立长度为n的单链表,在第i个结点之前插入数据元素data。
输入
第一行为自然数n,表示链式线性表的长度; 第二行为n个自然数表示链式线性表各元素值; 第三行为指定插入的位置i;第四行为待插入数据元素data。
输出
指定插入位置合法时候,输出插入元素后的链式线性表的所有元素,元素之间用一个空格隔开。输入不合法,输出"error!"。
样例输入复制
5 1 2 3 4 5 3 6
样例输出复制
1 2 6 3 4 5
代码
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LinkNode;
void InitList(LinkNode *&L)
{
L = (LinkNode *)malloc(sizeof(LinkNode));
L->next = NULL;
}
void CreateList(LinkNode *&L)//尾插法
{
int n,i,a[100];
LinkNode *s,*r;
r = L;//r始终指向尾结点,初始时指向头结点
scanf("%d",&n);
for(int i=0;i<n;i++){ //循环建立数据结点s
s=(LinkNode *)malloc(sizeof(LinkNode));
scanf("%d",&a[i]);
s->data = a[i]; //创建数据节点s
r->next = s; //将结点s插入到结点r之后;
r = s;
}
r->next = NULL; //尾结点的next域置为null
}
bool ListInsert(LinkNode *&L,int i,int data)
{
int j = 0;
LinkNode *p = L, *s; //p指向头结点,j置为0,即头结点序号为0
if(i<=0)return false; //i错误时返回false
while(j<i-1 && p!=NULL) { //查找i-1个结点p
j++;
p = p->next;
}
if(p == NULL) return false; //未找到第i-1个结点,返回false
else { //找到第i-1个结点p,插入新结点并返回true
s = (LinkNode *)malloc(sizeof(LinkNode));
s->data = data; //建立新结点s,其data域置为e
s->next = p->next; //结点s插入到p之后
p->next = s;
return true;
}
}
void DispList(LinkNode *&L)
{
LinkNode *p = L->next; //p指向首结点
while(p!=NULL){ //p不为NULL时,输出p结点的data域
printf("%d ",p->data);
p = p->next;
}
}
int main()
{
int i,data;
LinkNode *L;
InitList(L);
CreateList(L);
scanf("%d",&i);
scanf("%d",&data);
bool c;
c = ListInsert(L,i,data);
if(c == false) printf("error!");
else DispList (L);
return 0;
}