#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define ERROR 0
#define OVERFLOW 0
#define OK 1
typedef int ElemType;
typedef int Status;
typedef struct DuLNode {
ElemType data;
struct DuLNode *prior;
struct DuLNode *next;
}DuLNode, *DuLinkList;
DuLinkList CreateListF(int n)
{
DuLinkList L;
DuLNode *s;
int i;
L = (DuLinkList)malloc(sizeof(DuLNode));
L->prior = L->next = NULL;
for (i = 0; i < n; i++)
{
s = (DuLinkList)malloc(sizeof(DuLNode));
scanf_s("%d", &s->data);
s->next = L->next;
if (L->next != NULL)
L->next->prior = s;
L->next = s;
s->prior = L;
}
return L;
}
DuLinkList CreateListR(int n)
{
DuLinkList L;
DuLNode*s, *r;
int i;
L = (DuLinkList)malloc(sizeof(DuLNode));
r = L;
for (i = 0; i < n; i++)
{
s = (DuLinkList)malloc(sizeof(DuLNode));
scanf_s("%d", &s->data);
r->next = s;
s->prior = r;
r = s;
}
r->next = NULL;
return L;
}
void PrintList(DuLinkList L)
{
DuLNode* p;
p = L->next;
while (p != NULL)
{
printf("%5d", p->data);
p = p->next;
}
printf("\n");
}
Status ListInsert(DuLinkList L, int i, ElemType e)
{
int j = 0;
DuLNode *p, *s;
p = L;
while (j < i - 1 && p != NULL)
{
j++;
p = p->next;
}
if (p == NULL)
return FALSE;
else
{
s = (DuLinkList)malloc(sizeof(DuLNode));
s->data = e;
s->next = p->next;
if (p->next != NULL)
p->next->prior = s;
s->prior = p;
p->next = s;
return TRUE;
}
}
Status ListDelete(DuLinkList L, int i)
{
int j = 0;
DuLNode*p, *q;
p = L;
while (j < i - 1 && p != NULL)
{
j++;
p = p->next;
}
if (p == NULL)
return FALSE;
else
{
q = p->next;
if (q == NULL)
return FALSE;
p->next = q->next;
if (p->next != NULL)
p->next->prior = p;
free(q);
return TRUE;
}
}
void Reverse(DuLinkList L)
{
DuLNode *p, *q;
p = L->next;
L->next = NULL;
while (p != NULL)
{
q = p->next;
p->next = L->next;
if (L->next != NULL)
L->next->prior = p;
L->next = p;
p->prior = L;
p = q;
}
}
int main()
{
int n, i, j;
ElemType e;
DuLinkList L, S;
printf("输入要建立顺序链表的元素个数:");
scanf_s("%d", &n);
printf("输入顺序链表的%d个元素(头插法创建单链表):", n);
L = CreateListF(n);
printf("顺序表中元素是:");
PrintList(L);
printf("输入插入的位置:");
scanf_s("%d", &i);
printf("输入要插入的值:");
scanf_s("%d", &e);
ListInsert(L, i, e);
printf("插入后的线性链表是:");
PrintList(L);
printf("输入删除的位置:");
scanf_s("%d", &j);
ListDelete(L, j);
printf("删除后的线性链表是:");
PrintList(L);
printf("输入要建立顺序链表的元素个数:");
scanf_s("%d", &n);
printf("输入顺序链表的%d个元素(尾插法创建单链表):", n);
S = CreateListR(n);
printf("顺序表中元素是:");
PrintList(S);
Reverse(S);
printf("逆置后顺序双链表中元素是:");
PrintList(S);
system("pause");
return 0;
}
