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

前言

数据结构老师布置了第一次程序设计作业,为照顾班级大多同学,所以作业也很简单,糊弄糊弄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 许可协议。转载请注明出处!
支持博主:如果您觉得文章对您有帮助,可以点击文章下方赞一下。您的鼓励是博主的最大动力!
原文地址:https://www.cnblogs.com/judezhang/p/14601804.html