问题描述
输入n个整数,创建一个双向循还链表表进行存储,这些整数从第二个结点至表尾递增有序(设a1<x<an-1) (链表中第i个元素其值为ai )。试编写程序,将第一个结点删除并插入表中适当位置,使整个链表递增有序
输入形式
先输入数据的个数,再输入数据
样例输入
5 3 1 2 4 5
样例输出
1 2 3 4 5
样例说明
输入数据的第一个数是整数的个数,其后是数据
代码
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
#define ElemType int
typedef struct listNode {
ElemType data;
struct listNode* llink, * rlink;
}List, * DoubleList;
/*初始化双向链表*/
void InitList(DoubleList* L) {
*L = (listNode*)malloc(sizeof(listNode));
(*L)->rlink = NULL;
(*L)->llink = NULL;
}
void Creatlist(DoubleList L, int n) {
listNode* r, * s;
ElemType c;
r = L;
while (n--) {
cin >> c;
s = (listNode*)malloc(sizeof(listNode));
s->data = c;
r->rlink = s;
s->llink = r;
r = s;
}
r->rlink = L;
L->llink = r;
}
void Insert(DoubleList L, ElemType e) {
listNode* s, * p;
for (p = L->rlink; p != L && p->data < e; p = p->rlink)
;
s = (listNode*)malloc(sizeof(listNode));
s->data = e;
s->llink = p->llink;
p->llink->rlink = s;
p->llink = s;
s->rlink = p;
return;
}
void Delete(DoubleList L, int i, ElemType* e) {
listNode* p;
int k = 0;
p = L;
while (p->rlink != L && k < i) {
p = p->rlink;
k++;
}
*e = p->data;
p->llink->rlink = p->rlink;
p->rlink->llink = p->llink;
free(p);
return;
}
void show(DoubleList L) {
listNode* s;
s = L->rlink;
while (s != L) {
cout << s->data << " ";
s = s->rlink;
}
cout << endl;
}
int main()
{
DoubleList L;
int len;
InitList(&L);
cin >> len;
Creatlist(L, len);
/*删除操作*/
ElemType tmp2;
Delete(L, 1, &tmp2);
/*插入操作*/
Insert(L, tmp2);
show(L);
return 0;
}