#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<stdlib.h>
#include <iostream>
#define Error 0
#define OK 1
typedef int ElemType;
typedef struct DuLNode
{
ElemType data;
struct DuLNode* prior;
struct DuLNode* next;
}DuLNode, * DuLinkList;
void CreatList(DuLinkList& L, int n)//头插法(逆向)建立双向链表
{
DuLNode* p;
int i;
L = new DuLNode;
L->prior = NULL;
L->next = NULL;
p = new DuLNode;
scanf("%d", &p->data);
p->next = NULL;
p->prior = L;
L->next = p;
for (i = 1; i < n; i++)
{
p = new DuLNode;
scanf("%d", &p->data);
p->prior = L;
p->next = L->next;
L->next->prior = p;
L->next = p;
}
}
void Display(DuLinkList L)
{
DuLNode* p;
p = L->next;
while (p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int DuLinkListInsert(DuLinkList& L, int i, int e)//i为插入元素的位置,范围是1~n
{
DuLNode* p, * s;
int j = 0;
p = L;
while (j < i - 1 && p)//在插入之前找第i-1个元素
{
p = p->next;
j++;
}
if (!p || j > i - 1) return Error;
if (p->next!=NULL)//如果插入的元素不是最后一个元素后面
{
s = new DuLNode;
s->data = e;
s->prior = p;
s->next = p->next;
p->next->prior = s;
p->next = s;
return OK;
}
else//如果插入的元素在最后一个元素后面,p->next为空,p->next->prior会报错(j=i-1)
{
s = new DuLNode;
s->data = e;
s->prior = p;
s->next = p->next;
p->next = s;
return OK;
}
}
int DuLinkListDelete(DuLinkList& L, int i)
{
DuLNode* p;
int j = 0;
p = L;
while (p->next && j < i)//找第i个元素
{
p = p->next;
j++;
}
if (!(p) || i > j) return Error;
if (p->next==NULL)
{
p->prior->next = p->next;
delete p;
}
else
{
p->prior->next = p->next;
p->next->prior = p->prior;
delete p;
Display(L);
}
return OK;
}
int main()
{
while (1) {
int n;
DuLinkList L;
printf("输入双向链表的节点数:");
scanf("%d", &n);
printf("倒序输入双向链表的值:\n");
CreatList(L, n);
printf("建立的双向链表为:\n");
Display(L);
//插入测试
int i, e;
printf("输入插入元素的位置:");
scanf("%d", &i);
printf("输入插入元素的值:");
scanf("%d", &e);
DuLinkListInsert(L, i, e);
printf("插入后的双向链表为:\n");
Display(L);
//删除测试
int k;
printf("输入删除元素的位置:");
scanf("%d", &k);
printf("删除后的双向链表为:\n");
DuLinkListDelete(L, k);
Display(L);
}
}
03-17
7554
10-17
09-18
1558
09-24
1082