zoukankan      html  css  js  c++  java
  • C++学习---单链表的构建及操作

    #include <iostream>
    using namespace std;
    
    typedef struct LinkNode
    {
        int elem;//节点中的数据
        struct  LinkNode *next;//节点中的后继指针
    }LinkNode,*LinkList;//LinkList为结构体LinkNode的指针
    
    //构造空的单链表L
    void InitList(LinkList &L) {
        L = new LinkNode;//生成头节点
        L->next = NULL;//头节点的后继指针初始化为NULL
    }
    
    //单链表的输入(后插法)
    void ListInput(LinkList &L) {
        int n = 0;//输入数据的个数
    	LinkNode *r = L;//尾指针r指向头节点
        cout << "你想要输入几个数据?" << endl;
        cin >> n;
        for (int i = 0; i < n; i++) {
            LinkNode *node = new LinkNode;
            cout << "请输入第" << i + 1 << "个数据:";
            cin >> node->elem;
            node->next = NULL; r->next = node;//将新节点*p插入尾节点*r
    		r = node;//r指向新的尾节点*p
        }
    }
    //单链表的输出
    void ListOutput(LinkList &L) {
        cout << "顺序表的值依次为:";
        LinkNode* p;
        p = L->next;
        while (p!=NULL)
        {
            cout << p->elem<<"	";
            p = p->next;
        }
    }
    
    //单链表的取值 i为取第几位值
    int GetElem(LinkList &L, int i) {
        LinkList p = L->next;//p指向首元节点
        int countNum = 1;//计数器
        while (p!=NULL&&countNum<i)
        {
            p = p->next;
            countNum++;
        }
        if (p == NULL || countNum > i)//如果p为空或者计数大于i了则返回空
            return NULL;
        else
            return p->elem;
    }
    //单链表的查找 e为查找的值  返回元素的内存地址
    LinkNode* LocateElem(LinkList &L, int e) {
        LinkNode *p = L->next;
        while (p&&p->elem!=e)
        {
            p = p->next;
        }
        return p;
    }
    //单链表的插入 i为插入的位置 e为插入的值
    bool ListInsert(LinkList& L, int i, int e) {
        LinkList p = L;
        int j = 0;
        while (p!=NULL&&j<i-1)//将第i位的后继指针赋值给p
        {
            p = p->next; j++;
        } 
        if (p == NULL||j>i-1) return false;
        LinkNode *s = new LinkNode;//生成新节点
        s->elem = e;//将e复制给节点s
        s->next = p->next;//先将p的后继指针赋值给新节点
        p->next = s;//再把p的后继指针改为新节点
        return true;
    }
    //单链表的删除 i为删除的位置
    bool ListDelete(LinkList& L, int i) {
        LinkList p = L;
        int j = 0;
        while (p!=NULL&&j<i-1)
        {
            p = p->next; j++;
        }
        if (p == NULL || j > i - 1) return false;
        LinkNode* s = new LinkNode;
        s = p->next;//将第i-1位元素的内存地址赋值给s
        p->next = s->next;//改变第i位元素的后继指针
        delete s;//释放第i位元素的内存空间
        return true;
    }
    
    int main()
    {
        LinkList LA;
    	int opearateNum = 0;//操作值
    	//初始化
    	InitList(LA);
    
    	while (true)
    	{
    		int selectIndex = 0;//增删查所用的索引
    		int selectValue = 0;//增查所用的值
    
    
    		cout << "1、输入顺序表	2、输出顺序表	3、取值	4、查值	5、插入	6、删除	7、退出" << endl;
    		cin >> opearateNum;
    		if (opearateNum == 7)
    			break;
    		switch (opearateNum)
    		{
    		case 1:
    			//数据输入
    			ListInput(LA);
    			system("pause");
    			system("cls");
    			break;
    		case 2:
    			//输出顺序表
    			ListOutput(LA);
    			system("pause");
    			system("cls");
    			break;
    		case 3:
    
    			cout << "输入要取第几位:";
    			cin >> selectIndex;
    			if (GetElem(LA, selectIndex) == 0)
    				cout << "没有第" << selectIndex << "位的值" << endl;
    			else
    				cout << "第" << selectIndex << "位的值:" << GetElem(LA, selectIndex) << endl;
    			system("pause");
    			system("cls");
    			break;
    		case 4:
    			cout << "输入要查找的值:";
    			cin >> selectValue;
    			if (LocateElem(LA, selectValue) == 0)
    				cout << "没有该值!" << endl;
    			else
    				cout << "值为" << selectValue << "的内存地址:" << LocateElem(LA, selectValue) << endl;
    			system("pause");
    			system("cls");
    			break;
    		case 5:
    			cout << "输入要插入的位置和值(如:第2位插入值为4,输入:2 4):";
    			cin >> selectIndex >> selectValue;
    			if (ListInsert(LA, selectIndex, selectValue))
    				cout << "插入成功!" << endl;
    			else
    				cout << "插入失败!" << endl;
    
    			system("pause");
    			system("cls");
    			break;
    		case 6:
    			cout << "输入要删除第几位:";
    			cin >> selectIndex;
    			if (ListDelete(LA, selectIndex))
    				cout << "删除成功!" << endl;
    			else
    				cout << "删除失败!" << endl;
    			system("pause");
    			system("cls");
    			break;
    		case 7:
    			break;
    		default:
    			cout << "无效操作,请重新输入!" << endl;
    			break;
    		}
    
    	}
    }
    

      

  • 相关阅读:
    【转】常见经济类名词解释
    Linux parted命令详解
    【转】Linux下从TCP状态机,三次握手判断DDOS攻击
    【转】Java学习---HashMap和HashSet的内部工作机制
    【转】Redis学习---阿里云Redis多线程性能增强版详解
    改变自己,改变世界
    对话任正非两万字实录:最重要的是要沉着
    qt手写输入法资料
    Qt框架及模块认识
    哲学必读10本经典著作
  • 原文地址:https://www.cnblogs.com/edllixiaoyu/p/13658427.html
Copyright © 2011-2022 走看看