• 线性表练习


    #include <stdio.h>
    #include <malloc.h>
    
    int Create();
    int Insert(int i, char content);
    int Delete(char content);
    int Show();
    int Select(int i);
    int Length();
    
    //定义结构体类型
    typedef struct Node {
        char data;
        struct Node* next;
    }node;
    
    //创建结构体类型的头指针
    node* head;
    //length为表长
    int length;
    
    
    int main()
    {
        int choose, i=0, j = 1;
        char x=0;
        head = NULL;
        while (j)
        {
            printf("
    				 线性表子系统");
            printf("
    		*************************************************");
            printf("
    		* 	         1------建 表 			* ");
            printf("
    		* 	         2------插 入 			* ");
            printf("
    		* 	         3------删 除 			* ");
            printf("
    		* 	         4------显 示 			* ");
            printf("
    		* 	         5------查 找 			* ");
            printf("
    		* 	         6------求 表 长 		* ");
            printf("
    		* 	         0------返 回 			* ");
            printf("
    		*************************************************");
            printf("
    		请选择菜单号码(0-6):");
            scanf("%d", &choose);
            printf("
    ");
            if (choose == 1)
            {
                Create();
                printf("
    				 建表成功!!!
    ");
            }
            else if (choose == 5)
            {
                Select(i);
            }
            else if (choose == 2)
            {
                Insert(i, x);
            }
            else if (choose == 3)
            {
                Delete(x);
            }
            else if (choose == 4)
            {
                if (head == NULL)
                {
                    printf("
    		抱歉!线性表为空,请先建表!");
                }
                else
                {
                    Show();
                }
            }
            else if (choose == 6)
            {
                Length();
            }
            else if (choose == 0)
            {
                j = 0;
            }
            else
            {
                printf("输入错误,请重新输入!");
            }
        }
    }
    
    //新建表
    int Create()
    {
        //content为用户输入的内容
        char content;
        //key判断是否继续循环
        int key = 1;
        //为头结点分配空间
        head = (node*)malloc(sizeof(node));
        //*l 为尾指针 *n为新指针
        node* l, * n;
        //表长初始值为0
        length = 0;
        //尾指针指向头结点
        l = head;
    
        printf("
    		请逐个输入结点。以g位结束标记!
    ");
        //根据key的值判断是否继续循环
        while (key)
        {
            printf("
    		请输入一个字符数据,并按回车:
    ");
            //接收用户输入的内容
            scanf_s("
    %c", &content, 12);
            //判断用户输入的字符是否为结束字符
            if (content != 'g')
            {
                //创建新结点
                n = (node*)malloc(sizeof(node));
                //表长加1
                length++;
                //将用户输入的内容赋给新结点
                n->data = content;
                //将新结点添加到尾指针的下一个结点位置
                l->next = n;
                //将新结点的下一个结点赋为空值
                n->next = NULL;
                //尾指针指向新结点
                l = n;
            }
            //用户输入结束字符,改变key值结束循环
            else
            {
                key = 0;
            }
        }
        return 0;
    }
    
    //添加
    int Insert(int i, char content)
    {
        node* p, * n;
        int num = 1;//num计数,方便指针定位到要插入的位置的前一位
    
        p = head;
    
        printf("		请输入要插的位置和数值<i x>,并按回车:
    ");
        scanf_s("
    %d %c", &i, &content, 20);
    
        if (i > 0)
        {
            //定位指针p到要添加的位置的前一位,即num=i-1
            while (p != NULL && num < i)
            {
                num++;
                p = p->next;
            }
            if (p != NULL)
            {
                n = (node*)malloc(sizeof(node));
                n->data = content;
                n->next = p->next;//把p结点的下一个结点放到新结点的后面
                p->next = n;//把新结点放到结点p后
                length++;
                printf("
    		插入成功");
            }
            else {
                printf("
    		线性表为空或插入的位置超界");
            }
        }
        else {
            printf("
    		线性表为空或插入的位置有误");
        }
        return 0;
    }
    
    //删除(按内容删除)
    int Delete(char content)
    {
        node* h, * l;//定义两个指针*h指向头结点,*l指向头结点后面的结点,方便删除之后把后面的结点往前移动
        h = head;//*h指向头结点
        l = head->next;
    
        printf("
    		请输入要删除的数据元素:");
        scanf("		%c", &content);
    
        //定位p指正到需要删除的结点
        while (l != NULL && l->data != content)
        {
            h = l;//指针h往后移动
            l = l->next;//指针l往后移动,h和l指针始终保持相邻,
            //l指针找到删除的结点删除之后,把l指针指向的结点的后一结点移动到h指针指向的结点的后面
        }
        if (l != NULL)
        {
            //把删除结点后的结点移动到h指针指向的结点后面
            h->next = l->next;
            free(l);//释放l指针
            length--;
            printf("
    		删除成功,结点%c已经被删除!", content);
        }
        else {
            printf("
    		抱歉!没有找到您要删除的结点
    ");
    
        }
        return 0;
    }
    
    //显示
    int Show()
    {
        node* p;
        p = head;
        printf("
    		显示线性表的所有元素:
    		");
        while (p->next != NULL)
        {
            printf("%5c", p->next->data);
            p = p->next;      //后移指针
        }
        if (head->next == NULL || p == NULL)
        {
            printf("
    		链表为空");
        }
        return 0;
    }
    
    //查找
    int Select(int i)
    {
        node* p;//用指针 p 指向当前扫描到的结点。
        int j = 0; //用 j 作统计已扫描结点数的计数器,j 的初值为 1 。
        p = head;//p 的初值指链表中的第一个元素.
        printf("
    		请输入要查找的结点的位置,并按回车:
    ");
        scanf_s("
    %d", &i, 10);
        //指针扫描到j==i即当前位置退出循环,定位指针p到查找的节点位置
        while (p->next != NULL && j < i)
        {
            p = p->next;
            j++;
        }
        if (j == i)          //当 j=i时,指针 p 所指的结点就是第 i 个结点
        {
            printf("
    		查找的此结点所在位置的值为:%c", p->data);
        }
    
        else
        {
            printf("
    		未找到此节点,请确认输入是否正确!!");
        }
        return 0;
    }
    
    //查询表长
    int Length()
    {
        node* p;
        length = 0;
        p = head;
        while (p->next != NULL && p != NULL)
        {
            length++;     //表的长度加1
            p = p->next;    //后移指针
    
        }
        if (p->next == NULL)      //如果到表尾
        {
            printf("
    		线性表的长度为:%d", length);
        }
        else
        {
            printf("
    		链表不存在");
        }
        return 0;
    }

    本文来自博客园,作者:{繁星划过天际},转载请注明原文链接:https://www.cnblogs.com/Aliez02/p/15417894.html

  • 相关阅读:
    java获取当前时间(年~~毫秒)
    python获取当前时间
    PyThon3运算符
    PyThon3中判断一个内容属于另一个内容("a" 在 “abcd”中
    PyThon3判断语句
    【BZOJ2460】元素(BJOI2011)-异或线性基+贪心
    【BZOJ3534】重建(SDOI2014)-矩阵树定理
    【BZOJ1227】虔诚的墓主人(SDOI2009)-线段树+离散化+组合数
    【BZOJ2815】灾难(ZJOI2012)-拓扑排序+建树+LCA
    【BZOJ2209】括号序列(JSOI2011)-Splay
  • 原文地址:https://www.cnblogs.com/Aliez02/p/15417894.html
Copyright © 2020-2023  润新知