双向链表-算法2.13-2.14

第1关:双链表练习

编写一个具有(x,y)坐标点所组成的双链表。

1.双链表的建立,2.双链表的删除, 3.双链表插入,与单链表略有差异,但思路基本相同

#include<iostream>
#include<string>
#include<fstream>
#include<iomanip>
using namespace std;

#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。
typedef int ElemType; //ElemType 为可定义的数据类型,此设为int类型

struct Point 
{
	int x;//ISBN
	int y;//书名
};
typedef struct DuLNode 
{
	Point data; //数据域
	struct DuLNode *prior; //直接前驱
	struct DuLNode *next; //直接后继
} DuLNode, *DuLinkList;


int length;

Status InitDuList_L(DuLinkList &L) 
{
	//构造一个空的双向链表L
    /********************************Begin******************************/
    L = new DuLNode;
    if(!L) return ERROR;
    L -> prior = NULL,L -> next = NULL;
	
    return OK;


    /*********************************End**************************/
}

DuLNode *GetElemP_DuL(DuLinkList L, int i) 
{
	//在带头结点的双向链表L中查找第i个元素,返回结点的地址
	/********************************Begin******************************/
    DuLinkList p = L;

    int k = 0;
    while(p && k < i)
    {
        p = p -> next;
        k ++ ;
    }

    if(k == i && p) return p;
    return NULL;


    /*********************************End**************************/
} //GetElemP_DuL

Status ListInsert_DuL(DuLinkList &L, int i, Point e) 
{ //算法2.13 双向链表的插入
	//在带头结点的双向链表L中第i个位置之前插入元素e,i的合法值为1<=i<=表长+1
	/********************************Begin******************************/
    DuLinkList p = GetElemP_DuL(L,i);
	if(!p) return ERROR;
	
    DuLinkList t = new DuLNode;
    t -> data = e;
    t -> next = p;
    t -> prior = p -> prior;
    p -> prior -> next = t;
    p -> prior = t;
	
	return OK;


    /*********************************End**************************/

} //ListInsert_DuL

Status ListDelete_DuL(DuLinkList &L, int i) 
{ //算法2.14 双向链表的删除
	//删除带头结点的双向链表L中第i个位置之前插入元素e,i的合法值为1<=i<=表长
	/********************************Begin******************************/
    int k = 0;
    DuLinkList p = L;
    
    while(p && k < i)
    {
    	p = p -> next;
    	k ++ ;
	}
	
	p -> prior -> next = p -> next;
    delete p;


    /*********************************End**************************/

}//ListDelete_DuL

void CreateDuList_L(DuLinkList &L, int m) 
{
	//正位序输入n个元素的值,建立带表头结点的双向链表L,同时建立前驱指针
	/********************************Begin******************************/
    DuLinkList p = L;

    while(m -- )
    {
        DuLinkList t = new DuLNode;
        cin >> t -> data.x >> t -> data.y;
        t -> next = NULL;
        t -> prior = p;
        p -> next = t;
        p = t;
    }


    /*********************************End**************************/
} //CreateDuList_L

int main() 
{
	int a, choose;
	char op;
	Point e;
	DuLinkList L, p;
    
    cin >> choose;
    
	while (choose --) 
	{
		cin >> op;
		switch (op) 
		{
			case 'I': //建立一个双向链表
				if (InitDuList_L(L))
				break;
			case 'C': //使用后插法创建双向链表
				int n;
				cin >> n;
				CreateDuList_L(L, n);
				break;
			case 'S': //双向链表的插入
				cin >> a;
				cin >> e.x >> e.y;
				ListInsert_DuL(L, a, e);
				break;
			case 'D': //双向链表的删除
				cin >> a;
				ListDelete_DuL(L, a);
				break;
		}
	}
 	//双向链表的输出
	p = L->next;
	while (p) 
	{
		cout << p->data.x << ' ' <<  p->data.y << endl;
		p = p->next;
	}
	
	return 0;
}

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值