zoukankan      html  css  js  c++  java
  • Demo

    顺序表

    #include <iostream>
    using namespace std;
    
    constexpr auto MAXSIZE = 100;
    constexpr auto ERROR = 0;
    constexpr auto OK = 1;
    typedef int ElemType;
    
    //顺序表的存储结构
    typedef struct
    {
    	ElemType* elem;
    	int length;
    }SqList;
    
    //构造一个空的顺序表
    int InitList(SqList &L)
    {
    	//申请MAXSIZE个ElemType型变量空间,整型指针L.elem指向该地址空间开始处
    	L.elem = new ElemType[MAXSIZE];
    	if (!L.elem) exit(OVERFLOW);
    	L.length = 0;
    	return OK;
    }
    
    //取值--通过e返回第i个元素的传值
    int GetElem(SqList L, int i, ElemType& e)
    {
    	if (i<1 || i>L.length) return ERROR;	//判断i值是否合理
    	e = L.elem[i - 1];	//elem[i-1]单元存储第i个数据元素
    	return OK;
    }
    //查找--在顺序表L中查找值为e的数据元素,返回其序号
    int LocateElem(SqList L, ElemType e)
    {
    	for (int i = 0; i < L.length; i++)
    	{
    		if (L.elem[i] == e) return i + 1;	//查找成功,返回序号i+1
    	}
    	return 0;	//查找失败,返回0
    }
    //插入--在顺序表L中第i个位置插入新的元素e,i值的合法范围是1<=i<=L.length+1
    int ListInsert(SqList& L, int i, ElemType e)
    {
    	if ((i < 1) || (i > L.length + 1)) return ERROR;	//i值不合法
    	if (L.length == MAXSIZE) return ERROR;	//当前存储空间已满
    	for (int j = L.length - 1; j >= i; j--)
    		L.elem[j + 1] = L.elem[j];
    	L.elem[i - 1] = e;
    	++L.length;
    	return OK;
    }
    //删除--在顺序表删除第i个元素,i值的合法范围是1<=i<=i.length
    int ListDelete(SqList& L, int i)
    {
    	if ((i < 1) || (i > L.length)) return ERROR;
    	for (int j = 0; j <= L.length - 1; j++)
    		L.elem[j - 1] = L.elem[j];
    	--L.length;
    	return OK;
    }
    
    
    int main()
    {
    	SqList L;
    	ElemType e;
    	int i;
    	//顺序表的初始化方法测试
    	if (InitList(L) == 1) 
    	{
    		cout << "顺序表初始化成功" << endl;
    		cout << "当前顺序表长度: " << L.length << endl;
    	}
    	//为方便测试其他方法,将顺序表L初始化赋值一些数据
    	int num[] = { 12,13,21,24,28,30,42,77 };
    	for (int n = 0; n < sizeof(num) / sizeof(num[0]); n++)
    	{
    		L.elem[n] = num[n];
    		L.length++;
    	}
    	cout << "赋值完成,当前顺序表长度: " << L.length << endl;
    	//测试顺序表的取值--返回第3个元素的值到e
    	if (GetElem(L, 3, e)) cout << "第3个元素的值是: " << e << endl;
    	//测试顺序表的查找--查找元素24的位置并返回
    	if (int index = LocateElem(L, 24)) { cout << "24的序号是: " << index << endl; }
    	else cout << "元素查找失败!" << endl;
    	//测试顺序表的插入--在第5个位置插入25
    	if (ListInsert(L, 5, 25)) cout << "插入后第5个位置为: " << L.elem[4] << endl;
    	//测试顺序表的删除--删除第4个元素
    	if (ListDelete(L, 4)) cout << "删除成功!" << endl;
    }
    

    单链表

    #include <iostream>
    using namespace std;
    
    constexpr auto ERROR = 0;
    constexpr auto OK = 1;
    typedef int ElemType;
    
    //单链表的存储结构
    typedef struct LNode
    {
    	ElemType data;
    	struct LNode* next;	//结点的指针域
    }LNode, * LinkList;	//LinkList为指向结构体LNode的指针类型
    
    //构造一个空的单链表L
    int InitList(LinkList& L)
    {
    	L = new LNode;	//生成新的结点为头结点,用头指针L指向头结点
    	L->next = NULL;		//头结点指针域为空
    	return OK;
    }
    
    //创建单链表--(前插法)逆位序输入n个元素的值,建立带表头结点的单链表
    void CreateList_H(LinkList& L, int n) {
    	L = new LNode;
    	L->next = NULL;		//建立一个带有头结点的单链表
    	LinkList p;
    	for (int i = n; i > 0; i--) {
    		p = new LNode;
    		cin >> p->data;
    		p->next = L->next;
    		L->next = p;
    	}
    
    }
    //创建单链表--(后插法)正位序输入n个元素的值,建立带表头结点的单链表
    void CreateList_R(LinkList& L, int n) {
    	L = new LNode;
    	L->next = NULL;		//建立一个带有头结点的单链表
    	LinkList r = L;		//尾指针r指向头结点
    	LinkList p;
    	for (int i = 0; i < n; ++i) {
    		p = new LNode;
    		cin >> p->data;
    		p->next = NULL;
    		r->next = p;	//r=上一个,所以将上一个结点next指向新建的p
    		r = p;		//r指向新的尾结点*p
    	}
    
    }
    
    //插入--在带有头结点的单链表L中第i个位置插入值为e的新节点
    int ListInsert(LinkList& L, int i, int e) {
    	LinkList p = L;
    	int j = 0;
    	//查找第i-1个结点,指向该结点
    	while (p && j < i - 1) {
    		p = p->next;	
    		j++;
    	}
    	if (p == NULL || j < i - 1) return ERROR;//检查插入位置是否合法
    	LinkList s;
    	s = new LNode;
    	s->data = e;
    	s->next = p->next;
    	p->next = s;
    	return OK;
    }
    
    //删除位置i上的元素,并由e返回删除的元素 
    int ListDelete(LinkList& L, int i) {
    	LinkList p = L, q;
    	int j = 0;
    	while (p->next && i - 1 > j) {//查找第i-1个结点,指向该结点
    		p = p->next;
    		j++;
    	}
    	if (!(p->next) || j > i - 1) return ERROR;	//删除位置不合法
    	q = p->next;
    	p->next = q->next;		//改变删除结点前驱结点的指针域
    	delete q;	//释放空间q
    	return OK;
    }
    
    //取值--在带有头结点的单链表L中根据序号i通过e返回第i个数据
    int GetElem(LinkList L, int i, ElemType& e) {
    	LinkList  p;
    	p = L->next;
    	int j = 1;
    	while (p && j < i) {
    		p = p->next;
    		j++;
    	}
    	if (!p || j > i) return ERROR;
    	e = p->data;
    	return OK;
    }
    
    //查找--在带有头结点的单链表L中查找值为e的元素
    LNode* LocateElem(LinkList L, ElemType e)
    {
    	LinkList p = L->next;	//初始化p指向首元结点
    	while (p != NULL && p->data != e)
    	{
    		p = p->next;
    	}
    	return p;	//查找成功返回为e的结点地址p,失败则p为NULL
    }
    
    //方便测试输入单链表
    void printLinklist(LinkList L) {
    	LinkList p;
    	p = L->next;
    	while (p != NULL) {
    		cout << p->data << " ";
    		p = p->next;
    	}
    }
    
    int main()
    {
    	LinkList L;
    	CreateList_H(L, 3);//创建一个长度为3的单链表
    	printLinklist(L);
    	cout << endl;
    
    	ListInsert(L, 2, 8);//向第二个位置插入8
    	printLinklist(L);
    	cout << endl;
    
    	ListDelete(L, 1);//删除第一个位置的元素
    	printLinklist(L);
    	cout << endl;
    
    	ElemType e;
    	GetElem(L, 2, e);	cout << e << endl;
    	cout << LocateElem(L, 12);
    	return 0;
    
    }
    
  • 相关阅读:
    JWT认证-插件准备
    drf 框架 三大组件
    drf框架 视图、工具视图、视图集
    drf框架 ModelSerializer
    CentOS6.5 上crontab每天自动备份mysql数据库
    php-GatewayWorker搭建实时聊天室
    Centos6.8实现SVN提交后自动更新目录
    Python在线聊天软件(Tkinter)
    Navicat for MySQL连接mysql数据库时提示错误:Can't connect to MySQL server (10060)
    Ubuntu16下apache2安装ssl阿里云证书
  • 原文地址:https://www.cnblogs.com/kongw/p/13968691.html
Copyright © 2011-2022 走看看