• 数据结构——程序设计(一)单链表功能的操作与实现


    前言

    数据结构老师布置了第一次程序设计作业,为照顾班级大多同学,所以作业也很简单,糊弄糊弄20分钟搞出来了

    概述

    功能:
    1、建立一个链表
    2、插入操作分为三种:在头结点后插入、在尾节点后插入、在第k个节点后插入
    3、可以查找字母
    4、可以删除字母并删除第k个节点后的字母
    5、可以打印输出链表

    原本想用c写的,但是

    因为有很多输入输出要写,所以用了cin cout,就改C++了,请用.cpp的方式打开

    程序有很多可优化的地方,请自行优化嘻嘻

    函数名和变量名称起的一坨屎,别介意,比如说eleType就用了没两次,这玩意应该全局用的,懒得打字了,哈哈哈哈

    以下废话
    主要是交流学习、记录自己短短的大学时光,现在时间过的太快了,如果说今天周五,明后天放假,很快昂,周一就来了,

    周一刚来,顺着顺着很快就周四了,都感觉不出来,一到周四,周五也很快来了....

    唉~~~而自己,还是个小废物

    代码实现

    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include <iostream>
    
    using namespace std;
    
    #define eleType char
    
    typedef struct Link {
        eleType val;
        struct Link *next;
    } Link;
    
    void print ( Link *L );
    Link* makeLink ( Link *f );
    int add_k ( Link *h, int k, char ch );
    int add_head ( Link *h, char ch );
    int add_end ( Link *h, Link *f, char ch );
    int del_ch ( Link *h, char ch );
    int del_k ( Link *h, int k );
    void del_all ( Link *h );
    int find ( Link *h, char ch );
    void print ( Link *L )
    {
        Link *T = L->next;
        cout << "***************" << endl;
        while ( T != NULL && T != L )
        {
            cout << T->val << ' ';
            T = T->next;
        }
        cout << endl << "***************" << endl;
    }
    
    
    int add_k ( Link *h, int k, char ch )
    {
        int cnt = 0;
        while ( h != NULL )
        {
            if ( cnt == k )
            {
                Link *T;
                T = (Link*) malloc ( sizeof ( Link ) );
                if ( T == NULL ) return 0;
                T->val = ch;
                T->next = h->next;
                h->next = T;
                return 1;
            }
            cnt++;
            h = h->next;
        }
        return 0;
    }
    
    int add_head ( Link *h, char ch )
    {
        Link *T;
        T = (Link*) malloc ( sizeof ( Link ) );
        if ( T == NULL ) return 0;
        T->val = ch;
        T->next = h->next;
        h->next = T;
        return 1;
    }
    
    int add_end ( Link *h, Link **f, char ch )
    {
        Link *T;
        T = (Link*) malloc ( sizeof ( Link ) );
        if ( T == NULL ) return 0;
        T->val = ch;
        T->next = NULL;
        ( *f )->next = T;
        ( *f ) = T;
        return 1;
    }
    
    int del_k ( Link *h, int k )
    {
        int cnt = 0;
        while ( h )
        {
            if ( cnt == k )
            {
                Link *T = h->next;
                h->next = h->next->next;
                free ( T );
                return 1;
            }
            cnt++;
            h = h->next;
        }
        return 0;
    }
    
    // 这里糊弄一下了
    void del_all ( Link *h )
    {
        h->next = NULL;
    }
    
    Link* makeLink ( Link **f )
    {
        Link *T = (Link*) malloc ( sizeof ( Link ) );
        if ( T == NULL ) exit ( -1 );
    
        *f = T;
        T->next = NULL;
        return T;
    }
    
    int find ( Link *h, char ch )
    {
        int cnt = 0;
        while ( h )
        {
            if ( h->val == ch )
            {
                return cnt;
            }
            cnt++;
            h = h->next;
        }
        return -1;
    }
    
    int del_ch ( Link *h, char ch )
    {
        int cnt = 0;
        while ( h )
        {
            if ( h->val == ch )
            {
                Link *T = h->next;
                h->next = h->next->next;
                free ( T );
                return 1;
            }
            cnt++;
            h = h->next;
        }
        return -1;
    }
    
    // main 函数很脏很烂,仅供测试,主功能型函数复杂度很高,暴力算法
    int main ( void )
    {
        Link *h, *f = NULL;
        h = makeLink ( &f );
    
        while ( 1 )
        {
            cout << "请输入您要进行的操作:
    1、头插  2、尾插  3、在第k个数据后插入  4、删除 5、查找字母 6、打印链表  7、退出" << endl;
    
            int op;
            cin >> op;
    
            switch ( op )
            {
                case 1:
                    {
                        cout << "请输入要插入的字符:" << endl;
                        char ch;
                        cin >> ch;
                        if ( add_head ( h, ch ) ) cout << "YES!" << endl;
                        else cout << "ERROR!!" << endl;
                        break;
                    }
    
                case 2:
                    {
                        cout << "请输入要插入的字符:" << endl;
                        char ch;
                        cin >> ch;
                        if ( add_end ( h, &f, ch ) ) cout << "YES!!" << endl;
                        else cout << "ERROR!!" << endl;
                        break;
                    }
    
                case 3:
                    {
                        cout << "在第几个数据后插入?:";
                        int k;
                        cin >> k;
                        cout << "请输入要插入的字符:" << endl;
                        char ch;
                        cin >> ch;
                        if ( add_k ( h, k, ch ) ) cout << "YES!!" << endl;
                        else cout << "ERROR!!" << endl;
                        break;
                    }
    
                case 4:
                    {
                        cout << "1、删除全部  2、删除第k个后面的数据  3、删除第一个包含字符ch的数据" << endl;
                        int n;
                        cin >> n;
    
                        if ( n == 1 )
                        {
                            del_all ( h );
                        } else if ( n == 2 ) {
                            cout << "请输入k值:" << endl;
                            int k;
                            cin >> k;
                            if ( del_k ( h, k ) ) cout << "YES!!" << endl;
                            else cout << "ERROR!!" << endl;
                        } else if ( n == 3 ) {
                            cout << "请输入要删除的字符:";
                            char ch;
                            cin >> ch;
                            if ( del_ch ( h, ch ) ) cout << "YES!!" << endl;
                            else cout << "ERROR!!" << endl;
                        }
                        break;
                    }
    
                case 5:
                    {
                        cout << "请输入要查找的字母" << endl;
                        char ch;
                        cin >> ch;
                        int k = find ( h, ch );
                        if ( k == -1 ) cout << "未找到" << endl;
                        else cout << ch << " 在第" << k << "个元素" << endl;
                        break;
                    }
    
                case 6:
                    {
                        print ( h );
                        break;
                    }
    
                case 7: exit ( 1 );
            }
        }
        return 0;
    }
    

    欢迎点赞评论留言交流哦~溜了

    作者:Jude_Zhang
    关于博主:评论和私信会在第一时间回复。或者直接私信我。
    版权声明:本博客所有文章除特别声明外,均采用BY-NC-SA 许可协议。转载请注明出处!
    支持博主:如果您觉得文章对您有帮助,可以点击文章下方赞一下。您的鼓励是博主的最大动力!
  • 相关阅读:
    overflow+文档流
    《大器晚成》读后感 读书笔记
    《指标陷阱》读后感 读书笔记
    《无限的游戏》读后感 读书笔记
    《最蓝的眼睛》读后感 读书笔记
    《正常人》读后感 读书笔记
    《玉米人》读后感 读书笔记
    《科举史》读后感 读书笔记
    《糖的故事》读后感 读书笔记
    《蒙克传》读后感 读书笔记
  • 原文地址:https://www.cnblogs.com/judezhang/p/14601804.html
Copyright © 2020-2023  润新知