目的要求
1.掌握双向链表的存储结构及其实现。
2.掌握双向链表的插入与删除算法的程序实现。
实验内容
1.利用尾插法建立一个双向链表。
2.遍历双向链表。
3.实现双向链表中删除一个指定元素。
4.在非递减有序双向链表中实现插入元素e仍有序的算法。
5.判断双向链表中元素是否对称,若对称返回 1,否则返回 0。
6.设元素为正整型,实现算法把所有奇数排列在偶数之前。
7.在主函数中设计一个简单菜单,调用上述算法。
实验说明
1.双向链表的类型定义
typedef int ElemType; // 元素类型
typedef struct DuLNode
{
ElemType data;
DuLNode *prior, *next;
} DuLNode, *pDuLinkList;
DuLinkList.h
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#define Maxsize 100
using namespace std;
typedef int ElemType; // 元素类型
typedef struct DuLNode
{
ElemType data;
DuLNode* prior, * next;
} DuLNode, * pDuLinkList;
void menu();//菜单
pDuLinkList creat_dlist();//建立带头节点双向链表
void display(pDuLinkList L);//遍历带头节点双链表
int delete_dlist(pDuLinkList L, int e);//删除双链表中的一个指定元素
int Insertdnode(pDuLinkList L, int e);//插入指定元素在非递减有序双链表中
int dlist_duicheng(pDuLinkList h);//判断双向链表是否对称
void odd_dlist(pDuLinkList h);//实现所有的奇数都排在偶数前面
#pragma once
DuLinkList.cpp
#include"DuLinkList.h"
//菜单
void menu() {
printf("*****************菜单*******************\n");
printf("1.运用尾差法创建双链表\n");
printf("2.遍历双向链表\n");
printf("3.实现双链表删除一个指定元素\n");
printf("4.在非递减有序双向链表中实现插入元素e仍有序\n");
printf("5.判断双向链表中元素是否对称若对称返回1否则返回0\n");
printf("6.实现算法把所有奇数排列在偶数之前\n");
printf("0.退出\n");
printf("请选择操作序号:\n");
}
//建立带头节点双向链表
pDuLinkList creat_dlist() {
pDuLinkList L, p, q;
L = (DuLNode*)malloc(sizeof(DuLNode));
L->prior = NULL;
q = L;
int x;
printf("please enter x(输入0结束):\n");
scanf_s("%d", &x);
while (x != 0)
{
p = (DuLNode*)malloc(sizeof(DuLNode));
if (p == NULL)
return 0;
p->data = x;
q->next = p;
p->prior = q;
q = p;
scanf_s("%d", &x);
}
q->next = NULL;
return L;
}
//遍历带头节点双链表
void display(pDuLinkList L) {
pDuLinkList p;
p = L->next;
printf("遍历结果为:\n");
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
//删除双链表中的一个指定元素
int delete_dlist(pDuLinkList L, int e) {
pDuLinkList p;
p = L->next;
while (p != NULL)
{
if (p->data == e)
{
p->prior->next = p->next;
p->next->prior = p->prior;
return 1;
}
else
p = p->next;
}
return 0;
}
//插入指定元素在非递减有序双链表中
int Insertdnode(pDuLinkList L, int e) {
pDuLinkList p, q;
p = L->next;
while (p != NULL)
{
if (p->data >= e)
p = p->next;
else
break;
}
p = p->prior;
q = (DuLNode*)malloc(sizeof(DuLNode));
if (q == NULL)
return 0;
q->data = e;
q->next = p->next;
p->next = q;
q->prior = p;
q->next->prior = q;
return 1;
}
//判断双向链表是否对称
int dlist_duicheng(pDuLinkList h) {
pDuLinkList p, q;
p = h->next;
q = h->next; int i = 1;
while (q->next != NULL)
{
q = q->next; i++;
}
if (i % 2)
{
while (p != q)
{
if (p->data != q->data)
return 0;
p = p->next;
q = q->prior;
}
}
else
{
while (p->next != q)
{
if (p->data != q->data)
return 0;
p = p->next;
q = q->prior;
}
if (p->data == q->data)
return 1;
}
return 1;
}
//实现所有的奇数都排在偶数前面
void odd_dlist(pDuLinkList h) {
pDuLinkList p, q;
p = h->next;
while (p != NULL)
{
if (p->data % 2 != 0)
{
q = p->next;
if (p->next != NULL)
{
p->next->prior = p->prior;
p->prior->next = p->next;
}
else
p->prior->next = NULL; //删除
p->next = h->next;
h->next->prior = p;
p->prior = h;
h->next = p;//插到头结点后面
p = q;
}
else
p = p->next;
}
}
main.cpp
#include"DuLinkList.h"
int main() {
menu();
pDuLinkList h;
int n, t, s, flag = 1;
h= (DuLNode*)malloc(sizeof(DuLNode));
while (~scanf_s("%d", &n))
{
switch (n)
{
case 1: h = creat_dlist(); break;
case 2: display(h); break;
case 3:printf("请输入要删除的数:\n");
scanf_s("%d", &t);
if (delete_dlist(h, t))
printf("删除成功\n");
else
printf("删除失败\n");
break;
case 4:printf("请输入要插入的数:\n");
scanf_s("%d", &t);
if (Insertdnode(h, t))
{
printf("插入成功,结果为:\n");
display(h);
}
else
printf("插入失败\n");
break;
case 5:if (dlist_duicheng(h))
printf("该链表对称\n");
else
printf("该链表不对称\n"); break;
case 6:odd_dlist(h);
display(h);
break;
case 0:flag = 0; break;
}
if (flag == 0)
break;
}
return 0;
}
vs2019运行成功
截图