zoukankan      html  css  js  c++  java
  • C++链表实现( 数据结构 易)

    楼主编程小白一个 最近在学数据结构,分享下自己的链表学习代码,欢迎大家指教和讨论。
    如有不懂,也欢迎提问,不过我真是菜鸡一个哈哈。

    #include<iostream>
    #include<malloc.h>
    using namespace std;
    typedef int ElementType;
    typedef struct LNode *List;           //结构体指针
    
    struct LNode
    {
    	ElementType data;
    	List next;
    };
    List L;
    
    List MakeEmpty();           //初始化链表
    int Length(List L);        //遍历链表求链表的长度
    List Findk(int k, List L);   //按序号查找
    int FindX(ElementType X, List L);   //按值查找
    List Insert(ElementType X, int i, List L);   //讲X插入到i-1个结点之后
    bool Delete(int i, List L);  //删除第i个结点
    void print(List L);    //输出链表元素
    
    List MakeEmpty() {
    	List L = new LNode;
    	L = NULL;
    	return L;
    }
    
    //求表长
    int Length(List L) {
    	List p = L;            //指向链表头结点;
    	int len = 0;
    	while (p) {
    		p = p->next;
    		len++;
    	}
    	return len;
    }
    
    //按序查找
    List Findk(int k, List L) {
    	List p = L;
    	int i = 1;
    	while (p && i < k) {
    		p = p->next;
    		i++;
    	}
    	if (i == k)                     //注意K可能是负数也是输入错误
    		return p;
    	else
    		return NULL;
    }
    
    //按值查找
    int FindX(ElementType X, List L) {
    	List p = L;
    	int count = 1;
    	while (p && p->data != X){
    		p = p->next;
    		count++;
    	}
    	return count;
    }
    
    //插入
    List Insert(ElementType X, int i, List L) {
    	List tmp, p;
    	tmp = new LNode;
    	tmp->data = X;
    	if (i == 1) {
    		tmp->next = L;
    		return tmp;        //返回新表头
    	}
    	else {
    		//查找位序为i-1的结点看是否在内
    		p = Findk(i - 1, L);
    		if (p == NULL) {
    			cout << "插入未知参数错误" << endl;
    			delete tmp;
    			return NULL;
    		}
    		else {
    			tmp->next = p->next;
    			p->next = tmp;
    			return L;   //返回表头
    		}
    	}	
    }
    
    //删除第i个结点
    bool Delete(int i, List L) {
    	List tmp, p;
    	if (i == 1){
    		tmp= L;
    		if (L != NULL)L = L->next;
    		else return NULL;
    		delete tmp;
    		return true;
    	}
    	p = Findk(i - 1, L);
    	if (p == NULL) {
    		cout << "第" << i - 1 << "个结点不存在,删除失败" << endl;
    		return false;
    	}
    	else if (p->next == NULL) {
    		cout << "第" << i << "个结点不存在,删除失败" << endl;
    		return false;
    	}
    	else {
    		tmp = p->next;
    		p->next = tmp->next;
    		delete tmp;
    		return true;
    	}
    }
    
    //输出链表元素
    void print(List L) {
    	int count = 0;
    	while (L) {
    		cout << L->data << "->";
    		L = L->next;
    		count++;
    	}
    	cout << endl;
    	if (count == 0) {
    		cout << "无数据输出" << endl;
    	}
    }
    
    int main()
    {
    	List tmp;
    	L = MakeEmpty();
    
    	L = Insert(1, 1, L);
    	L = Insert(2, 2, L);
    	L = Insert(3, 3, L);
    	L = Insert(4, 4, L);
    	L = Insert(5, 5, L);
    
    	print(L);
    	int length = Length(L);
    	cout << "该链表的长度为" << length << endl;	
    	
    	int i; cout << "请输入你想搜寻的位置下标:  ";
    	cin >> i; 
    	tmp = Findk(i, L);
    	cout << "第"<<i<<"个下标对应的值为" << tmp->data << endl;
    
    	int x; cout << "请输入你想搜寻的元素的值:  ";
    	cin >> x;
    	int q = FindX(x,L);
    	cout << "元素" << x << "在链表的位置是: " << q << endl;
    
    	int j; cout << "请输入你想删除的元素位置: ";
    	cin >> j;
    	if (Delete(j, L)){
    		cout << "删除后的链表为: ";
    		print(L);
    	}
    }
    
  • 相关阅读:
    CSU 1554 SG Value —— 思维
    最优配对问题(集合上的动态规划) —— 状压DP
    Codeforces Round #374 (Div. 2) D. Maxim and Array —— 贪心
    Codeforces Round #373 (Div. 2) C. Efim and Strange Grade —— 贪心 + 字符串处理
    Codeforces Round #369 (Div. 2) D. Directed Roads —— DFS找环 + 快速幂
    Codeforces Round #374 (Div. 2) C. Journey —— DP
    Codeforces Round #363 (Div. 2) D. Fix a Tree —— 并查集
    Codeforces Round #374 (Div. 2) B. Passwords —— 基础题
    Codeforces Round #374 (Div. 2) A. One-dimensional Japanese Crossword —— 基础题
    UVA10129 Play on Words —— 欧拉回路
  • 原文地址:https://www.cnblogs.com/Hsiung123/p/13110008.html
Copyright © 2011-2022 走看看