数据结构-双向链表

一、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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值