zoukankan      html  css  js  c++  java
  • 线性表练习

    #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

  • 相关阅读:
    A1023 Have Fun with Numbers (20分)(大整数四则运算)
    A1096 Consecutive Factors (20分)(质数分解)
    A1078 Hashing (25分)(哈希表、平方探测法)
    A1015 Reversible Primes (20分)(素数判断,进制转换)
    A1081 Rational Sum (20分)
    A1088 Rational Arithmetic (20分)
    A1049 Counting Ones (30分)
    A1008 Elevator (20分)
    A1059 Prime Factors (25分)
    A1155 Heap Paths (30分)
  • 原文地址:https://www.cnblogs.com/Aliez02/p/15417894.html
Copyright © 2011-2022 走看看