线性表练习

#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("\n\t\t\t\t 线性表子系统");
        printf("\n\t\t*************************************************");
        printf("\n\t\t* \t         1------建 表 \t\t\t* ");
        printf("\n\t\t* \t         2------插 入 \t\t\t* ");
        printf("\n\t\t* \t         3------删 除 \t\t\t* ");
        printf("\n\t\t* \t         4------显 示 \t\t\t* ");
        printf("\n\t\t* \t         5------查 找 \t\t\t* ");
        printf("\n\t\t* \t         6------求 表 长 \t\t* ");
        printf("\n\t\t* \t         0------返 回 \t\t\t* ");
        printf("\n\t\t*************************************************");
        printf("\n\t\t请选择菜单号码(0-6):");
        scanf("%d", &choose);
        printf("\n");
        if (choose == 1)
        {
            Create();
            printf("\n\t\t\t\t 建表成功!!!\n");
        }
        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("\n\t\t抱歉!线性表为空,请先建表!");
            }
            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("\n\t\t请逐个输入结点。以g位结束标记!\n");
    //根据key的值判断是否继续循环
    while (key)
    {
        printf("\n\t\t请输入一个字符数据,并按回车:\n");
        //接收用户输入的内容
        scanf_s("\n%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("\t\t请输入要插的位置和数值<i x>,并按回车:\n");
    scanf_s("\n%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("\n\t\t插入成功");
        }
        else {
            printf("\n\t\t线性表为空或插入的位置超界");
        }
    }
    else {
        printf("\n\t\t线性表为空或插入的位置有误");
    }
    return 0;
}

//删除(按内容删除)
int Delete(char content)
{
    node* h, * l;//定义两个指针*h指向头结点,*l指向头结点后面的结点,方便删除之后把后面的结点往前移动
    h = head;//*h指向头结点
    l = head->next;

    printf("\n\t\t请输入要删除的数据元素:");
    scanf("\t\t%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("\n\t\t删除成功,结点%c已经被删除!", content);
    }
    else {
        printf("\n\t\t抱歉!没有找到您要删除的结点\n");

    }
    return 0;
}

//显示
int Show()
{
    node* p;
    p = head;
    printf("\n\t\t显示线性表的所有元素:\n\t\t");
    while (p->next != NULL)
    {
        printf("%5c", p->next->data);
        p = p->next;      //后移指针
    }
    if (head->next == NULL || p == NULL)
    {
        printf("\n\t\t链表为空");
    }
    return 0;
}

//查找
int Select(int i)
{
    node* p;//用指针 p 指向当前扫描到的结点。
    int j = 0; //用 j 作统计已扫描结点数的计数器,j 的初值为 1 。
    p = head;//p 的初值指链表中的第一个元素.
    printf("\n\t\t请输入要查找的结点的位置,并按回车:\n");
    scanf_s("\n%d", &i, 10);
    //指针扫描到j==i即当前位置退出循环,定位指针p到查找的节点位置
    while (p->next != NULL && j < i)
    {
        p = p->next;
        j++;
    }
    if (j == i)          //当 j=i时,指针 p 所指的结点就是第 i 个结点
    {
        printf("\n\t\t查找的此结点所在位置的值为:%c", p->data);
    }

    else
    {
        printf("\n\t\t未找到此节点,请确认输入是否正确!!");
    }
    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("\n\t\t线性表的长度为:%d", length);
    }
    else
    {
        printf("\n\t\t链表不存在");
    }
    return 0;
}

 

posted @ 2021-10-17 19:55  Aliezerofist  阅读(39)  评论(0编辑  收藏  举报