一、main
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdio.h>
#include "com.h"
using namespace std;
// 1.初始化单链表
void initlist_l(DuLinkList &L , int &flag)
{
if(flag == 1)
cout << "\t\t\t链表已存在,不能重复执行该操作" ;
else
{
if(InitList(L) == OVERFLOW)
cout << "\t\t\t操作失败" ;
else
{
cout << "\t\t\t初始化单链表成功!" ;
flag = 1;
}
}
cout << endl << endl ;
}
// 2.用头插法输入元素 3.用尾插法输入元素
void createlist_l(DuLinkList &L , int flag , int t)
{
int n ;
cout << "\t\t\t请输入待输入元素个数:" ;
cin >> n ; cout << "\t\t\t" ;
if(n < 1) cout << "n值不合法!" ;
else if(flag == 0) cout << "请先初始化链表!" ;
else if(t == 2) HeadCreateList_L(L , n) ; // 头插法
else if(t == 3) TailCreateList_L(L , n) ; // 尾插法
cout << "\t\t\t现链表为:" ;// << endl << "\t\t\t"
ListTraverse(L) ;
cout << "\t\t\t输入成功!" << endl << endl ;
}
// 4.销毁链表 5.清空链表
//void destroyclear(LinkList &L , int &flag , int t)
//{
// if(flag == 0) cout<< "\t\t\t请先初始化链表" ;
// else if(t == 4)
// {
// if(DestroyList(L) == OK)
// {
// flag = 0;
// cout << "\t\t\t销毁链表成功!";
// }
// }
// else if(t == 5)
// {
// ClearList(L) ;
// cout << "\t\t\t清空链表成功!";
// }
// cout << endl << endl ;
//}
//8.查看第i个元素
//void getelem_l(LinkList &L , int flag)
//{
// int i ;
// ElemType e ;
// if(flag == 0) cout<< "\t\t\t请先初始化链表" ;
// else
// {
// cout << "\t\t\t请输入序号i:" ;
// cin >> i ;
// if(GetElem_L(L ,i , e) == ERROR) cout << "\t\t\ti值不合法!";
// else cout << "\t\t\t序列第" << i << "个元素为" << e ;
// }
// cout << endl << endl ;
//}
9.查看元素e的位序
//void locateelem(LinkList &L , int flag)
//{
// ElemType e ;
// if(flag == 0) cout<< "\t\t\t请先初始化链表" ;
// else
// {
// cout << "\t\t\t请输入你想查看的元素值e:";
// cin >> e ;
// if(LocateElem_L(L , e) == ERROR) cout << "\t\t\t该元素不存在" ;
// else cout << "\t\t\t该元素的位置为" << LocateElem_L(L , e) ;
// }
// cout << endl << endl ;
//}
10.求输入元素的直接前驱
//void priorelem(LinkList &L , int flag)
//{
// int cur_e ;
// ElemType pre_e ;
// if(flag == 0) cout << "\t\t\t请初始化链表!" ;
// else
// {
// cout << "\t\t\t请输入元素值:";
// cin >> cur_e ;
// if(PriorElem( L , cur_e , pre_e) == OVERFLOW) cout << "\t\t\t该元素不存在";
// else if(PriorElem( L , cur_e , pre_e) == ERROR) cout << "\t\t\t第一元素无前驱" ;
// else cout << "\t\t\t元素" << cur_e << "的直接前驱为" << pre_e ;
// }
// cout << endl << endl ;
//}
11.求输入元素的直接后继
//void nextelem(LinkList &L , int flag)
//{
// int cur_e ;
// ElemType next_e ;
// if(flag == 0) cout << "\t\t\t请初始化链表!" ;
// else
// {
// cout << "\t\t\t请输入元素值:";
// cin >> cur_e ;
// if(NextElem(L , cur_e , next_e) == OVERFLOW) cout << "\t\t\t该元素不存在";
// else if(NextElem(L , cur_e , next_e) == ERROR) cout << "\t\t\t最后元素无后继";
// else cout << "\t\t\t元素" << cur_e << "的直接后继为" << next_e ;
// }
// cout << endl << endl ;
//}
// 13.在第i个位置插入一个元素
void listinsert(DuLinkList &L , int flag)
{
int i ;
ElemType e;
if(flag == 0) cout << "\t\t\t请先初始化链表!";
else
{
cout << "\t\t\t请要输入插入位置i:" ;
cin >> i ;
cout << "\t\t\t请输入插入值:";
cin >> e;
if(ListInsert(L , i , e) == ERROR)
cout << "\t\t\ti值不合法,操作失败" << endl;
else
cout << "\t\t\t已在表中i=" << i << "位置插入元素" << e << endl ;
cout << "\t\t\t现在的列表为:" ;
ListTraverse(L) ;
}
cout << endl << endl ;
}
// 14.删除第i个元素
void listdelete(DuLinkList &L , int flag)
{
int i ;
ElemType e;
if(flag == 0) cout << "\t\t\t请先初始化链表!";
else
{
cout << "\t\t\t请输入要删除位置i:" ;
cin >> i ;
if(ListDelete(L , i , e) == ERROR)
cout << "\t\t\ti值不合法,操作失败" << endl;
else
cout << "\t\t\t已删除第" << i << "个元素" << e << endl;
cout << "\t\t\t现在的列表为:" ;
ListTraverse(L) ;
}
cout << endl << endl ;
}
15.置换第i个元素
//void putelem(LinkList &L , int flag)
//{
// int i ;
// ElemType e;
// if(flag == 0) cout << "\t\t\t请先初始化链表!";
// else
// {
// cout << "\t\t\t请输入你想置换的元素序号:" ;
// cin >> i ;
// cout << "\t\t\t元素置换成:" ;
// cin >> e ;
// if(PutElem(L , i , e) == ERROR)
// cout << "\t\t\ti值不合法,操作失败" ;
// else
// cout << "\t\t\t第" << i << "个元素已置换成" << e << endl;
// cout << "\t\t\t现链表为:" ;//<< endl << "\t\t\t" ;
// ListTraverse(L) ;
// }
// cout << endl << endl ;
//}
16.实现单链表的逆序存放
//void reverselist(LinkList &L , int flag)
//{
// if(flag == 0) cout << "\t\t\t请先初始化链表!" ;
// else
// {
// ReverseList(L) ;
// cout << "\t\t\t逆序成功!" << endl ;
// cout << "\t\t\t逆序后的链表为:" << endl << "\t\t\t" ;
// ListTraverse(L) ;
// }
// cout << endl << endl ;
//}
// 主菜单
void Menu(DuLinkList &L , int flag)
{
printf("\t\t\t=================================================================\n");
printf("\t\t\t| |\n");
printf("\t\t\t| 双向链表基本操作 |\n");
printf("\t\t\t| |\n");
printf("\t\t\t|===============================================================|\n");
printf("\t\t\t| 请选择要操作的命令 |\n");
printf("\t\t\t|---------------------------------------------------------------|\n");
printf("\t\t\t| |\n");
printf("\t\t\t| 0.退出整个系统 1.初始化单链表 |\n");
printf("\t\t\t| 2.用头插法输入元素 3.用尾插法输入元素 |\n");
// printf("\t\t\t| 4.销毁链表 5.清空链表 |\n");
// printf("\t\t\t| 6.判断链表 是否为空 7.查看链表长度 |\n");
// printf("\t\t\t| 8.查看第i个元素 9.查看元素e的位序 |\n");
// printf("\t\t\t| 10.求输入元素的直接前驱 11.求输入元素的直接后继 |\n");
printf("\t\t\t| 12.遍历-输出链表所有的元素 13.在第i个位置插入一个元素 |\n");
// 15.置换第i个元素
printf("\t\t\t| 14.删除第i个元素 |\n");
// printf("\t\t\t| 16.实现单链表的逆序存放 |\n");
printf("\t\t\t| |\n");
printf("\t\t\t=================================================================\n");
printf("\t\t\t选择(0---16):\t");
int choice ;
cin >> choice ;
switch(choice)
{
case 0 : // 0.退出整个系统
cout << "\t\t\t你已退出" << endl ;
exit(0) ;
break ;
case 1 : // 1.初始化单链表
initlist_l(L , flag) ;
break ;
case 2 : // 2.用头插法输入元素 逆序
createlist_l(L , flag , 2) ;
break ;
case 3 : // 3.用尾插法输入元素
createlist_l(L , flag , 3) ;
break ;
// case 4 : // 4.销毁链表
// destroyclear(L , flag , 4) ;
// break ;
// case 5 : // 5.清空链表
// destroyclear(L , flag , 5) ;
// break ;
case 6 : //6.判断链表是否为空
if(ListEmpty(L)) cout << "\t\t\t该表为空表";
else cout << "\t\t\t该表不是空表" ;
cout << endl << endl ;
break ;
case 7 : // 7.查看链表长度
if(flag == 0) cout << "\t\t\t请先初始化链表" ;
else cout << "\t\t\t表长为" << ListLength(L) ;
cout << endl << endl ;
break ;
// case 8 : // 8.查看第i个元素
// getelem_l(L , flag) ;
// break ;
// case 9 : // 9.查看元素e的位序
// locateelem(L , flag) ;
// break ;
// case 10 : // 10.求输入元素的直接前驱
// priorelem(L , flag) ;
// break ;
// case 11 :// 11.求输入元素的直接后继
// nextelem(L , flag) ;
// break ;
case 12 : // 12.遍历-输出链表所有的元素
cout << "\t\t\t" ;
ListTraverse(L) ;
cout << endl << endl ;
break ;
case 13 : // 13.在第i个位置插入一个元素
listinsert(L , flag) ;
break ;
case 14 : // 14.删除第i个元素
listdelete(L , flag);
break ;
// case 15 : // 15.置换第i个元素
// putelem(L , flag) ;
// break ;
// case 16 : //16.实现单链表的逆序存放
// reverselist(L , flag) ;
// break ;
default :
cout << "\t\t\t输入不合理,请重新输入" ;
cout << endl << endl ;
}
Menu(L , flag) ;
}
int main(int argc, char** argv)
{
DuLinkList L ; // L为单链表的头指针
int flag = 0;
Menu(L , flag) ; // 菜单函数
return 0;
}
二、function
#include <stdlib.h>
#include "com.h"
#include <iostream>
using namespace std;
// 1.初始化单链表
Status InitList(DuLinkList &L)
{
L = (DuLinkList)malloc(sizeof(DuLNode)) ;
L->prior = NULL ;
L->next = NULL ;
return OK ;
}
//2.用头插法输入元素 逆序
Status HeadCreateList_L(DuLinkList &L , int n)
{
if(!L || n < 1) return ERROR ;
int i ;
DuLinkList s ;
for(i = 1 ; i <= n ; i ++)
{
s = (DuLinkList)malloc(sizeof(DuLNode)) ;
cin >> s->data ;
s->next = L->next ;
// L->next->prior = s ;
s->prior = L ;
L->next = s ;
}
return OK ;
}
//3.用尾插法输入元素 顺序
Status TailCreateList_L(DuLinkList &L , int n)
{
if(!L || n < 1) return ERROR ;
int i ;
DuLinkList s , r = L; // r是尾指针
for(i = 1 ; i <= n ; i ++)
{
s = (DuLinkList)malloc(sizeof(DuLNode)) ;
cin >> s->data ;
s->prior = r ;
r->next = s ;
r = s ;
}
r->next = NULL ; // 尾指针指向空
}
//6.判断链表是否为空
Status ListEmpty(DuLinkList L)
{
if(L->next = NULL) return 1 ; // 空
else return 0 ; // 非空
}
// 7.查看链表长度
int ListLength(DuLinkList L)
{
DuLinkList p = L->next ;
int len = 0;
while(p)
{
len ++ ;
p = p->next ;
}
return len ;
}
// 12.遍历-输出链表所有的元素
void ListTraverse(DuLinkList L)
{
DuLinkList p = L->next;
L = new LNode ;
// for(p = L->next ; p ; p=p->next)
// {
// cout << p->data << " " ;
// }
while(p)
{
cout << p->data << " " ;
p = p->next ;
}
cout << endl << endl ;
}
// 13.在第i个位置插入一个元素 o(n)
Status ListInsert(DuLinkList &L , int i , ElemType e)
{
DuLinkList p = L , s ;
int j = 0;
// 让p指向第i-1个位置
while(p && j < i-1)
{
p = p->next ;
j ++ ;
}
if(!p || j > i-1) return ERROR ;
s = (DuLinkList) malloc(sizeof(DuLNode));
s->data = e ;
p->next->prior = s ;
s->next = p->next;
s->prior = p;
p->next = s ;
return OK ;
}
// 14.删除第i个元素 o(n)
Status ListDelete(DuLinkList &L , int i , ElemType &e)
{
DuLinkList p = L;
int j = 0 ;
// 让p指向第i个位置
while(p->next && j < i)
{
p = p->next ;
j ++ ;
}
if(!p->next || j > i) return ERROR ;
e = p->data ;
p->prior->next = p->next ;
p->next->prior = p->prior ;
delete p ;
return OK ;
}
三、com
#ifndef _FUNC_H
#define _FUNC_H
#define OK 0
#define ERROR -1
#define OVERFLOW -2
typedef int Status ;
typedef int ElemType ;
// 结构体
typedef struct DuLNode
{
ElemType data ;
struct DuLNode *prior ; //
struct DuLNode *next ;
}DuLNode , *DuLinkList ;
extern Status InitList(DuLinkList &L) ;
extern Status HeadCreateList_L(DuLinkList &L , int n);
extern Status TailCreateList_L(DuLinkList &L , int n) ;
extern Status ListEmpty(DuLinkList L) ;
extern int ListLength(DuLinkList L) ;
extern void ListTraverse(DuLinkList L) ;
extern Status ListInsert(DuLinkList &L , int i , ElemType e);
extern Status ListDelete(DuLinkList &L , int i , ElemType &e) ;
#endif