【输入形式】
第一行输入一个N(N大于等于1,小于1000);
第二行输入N个整数,以空格作为分隔,创建长度为N的双向链表,为双向输出方便,需保留头尾指针;
第三行输入pos和e,以空格分隔,分别表示插入位置和插入元素的值。
【输出形式】
若插入位置合法,插入成功,则输出:
第一行从头开始顺向输出双向链表中元素,用空格分隔;
第二行从尾结点开始逆向输出双向链表中元素,用空格分隔。
若插入位置不合法,例如插入位置<1或超出链表范围,则输出error
【样例输入1】
5
-4 5 2 7 0
2 100
【样例输出1】
-4 100 5 2 7 0
0 7 2 5 100 -4
【样例输入2】
5
1 2 3 4 5
6 6
【样例输出2】
1 2 3 4 5 6
6 5 4 3 2 1
【样例输入3】
5
1 2 3 4 5
8 8
【样例输出3】
error
#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
#define ERROR 0
#define OK 1
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *prior,*next;
}LNode,*LinkList;
int Create(LinkList *head,LinkList *rear,int n)
{
int i;
ElemType e;
LinkList p,q;
*head=*rear=p=(LNode*)malloc(sizeof(LNode));
if(!p) return 0;
p->prior=NULL;
for(i=0;i<n;i++)
{
scanf("%d",&e);
q=(LNode*)malloc(sizeof(LNode));
q->data=e;
q->prior=p;
p->next=q;
p=q;
}
p->next=NULL;
*rear=p;
return 1;
}
void Print(LinkList head,LinkList rear)
{
LinkList p=head->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}printf("\n");
p=rear;
while(p->prior)
{
printf("%d ",p->data);
p=p->prior;
}printf("\n");
}
int Insert(LinkList head,LinkList *rear,int pos,ElemType e)
{
LinkList s,p;
int i=1;
p=head;
while(p!=NULL&&i<pos)
{
p=p->next;
i++;
}
if(p==NULL||pos<1) return 0;
s=(LNode*)malloc(sizeof(LNode));
s->data=e;
if(p->next==NULL)
{
s->prior=p;
p->next=s;
(*rear)=(*rear)->next;
(*rear)->next=NULL;
return 1;
}
else
{
s->next=p->next;
p->next->prior=s;
s->prior=p;
p->next=s;
return 1;
}
}
int main()
{
LinkList head,rear;
int n;
int pos;
ElemType e;
scanf("%d",&n);
Create(&head,&rear,n);
scanf("%d%d",&pos,&e);
if(Insert(head,&rear,pos,e)){
Print(head,rear);
}
else
printf("error\n");
return 1;
}