数据结构C语言实现----单链表实例

时间:2024-01-27 08:54:22

  编写一个程序,要求:从终端输入一组整数(大于10个数),以0作为结束标志,将这一组整数,存放在一个链表中(结束标志0不包括在内),打印出该链表中的值。然后删除该链表中的第五个元素,打印出删除后的结果。最后在内存中释放掉该链表;

 

程序清单:

#include<stdio.h>
#include<stdlib.h>
/*****************************************************************
 * 把一组数(大于10个)存到一个链表中,以0为结束标志,链表里不包含0
 * 打印链表中的值
 * 删除该链表中的而第五个元素
 * 打印删除后的结果
 * 销毁链表 
 *****************************************************************/

typedef struct Node
{
    int date;
    struct Node *next;
}Node , *LinkList;

/////////////////////////////////////////////////////////////////
//创建一个链表
LinkList creatlinklist(int n)
{
    LinkList New_node , Tail_node;
    LinkList Head_node = NULL;
    int c;
    for (size_t i = 1; i < n; i++)
    {
        printf("请输入第%d个节点存入的数据:",i);
        scanf("%d",&c);
        if (c!=0)
        {
            New_node = (LinkList)malloc(sizeof(Node));
            New_node->date = c;
            New_node->next = NULL;

            if (Head_node==NULL)
            {
                Head_node = New_node;
            }else
            {
                Tail_node->next = New_node;
            }
            Tail_node = New_node;
        }else
        {//如果输入中出现0,结束链表的数据读取
            return Head_node;
        }
    }
    return Head_node;
}
////////////////////////////////////////////////////////////////////
//删除链表中的某个元素
void deletlinklist(LinkList *List , int n)
{
    LinkList dele_node = *List;
    for (size_t i = 1; i <n; i++)
    {
        dele_node = dele_node->next;
    }
    if (n==1)
    {
        *List = dele_node->next;
        free(dele_node);
    }else
    {
        LinkList befor_node = *List;
        for (size_t i = 1; i < n-1; i++)
        {
            befor_node = befor_node->next;
        }
        befor_node->next = dele_node->next;
        free(dele_node);
    }
}
/////////////////////////////////////////////////////////////////////
//链表中插入元素
void insertlinklist(LinkList *List , int m , int date)
{
    LinkList insert_node , befor_node;
    insert_node = (LinkList)malloc(sizeof(Node));
    insert_node->date = date;
    insert_node->next = NULL;
    if (m!=1)
    {
        befor_node = *List;
        for (size_t i = 1; i <= m-1; i++)
        {
            befor_node = befor_node->next;
        }
        insert_node->next = befor_node->next;
        befor_node->next = insert_node;
    }else
    {
        *List = insert_node;
    }
    
}
/////////////////////////////////////////////////////////////////////
//销毁链表
void destrylinklist(LinkList *List)
{
    LinkList p,q;
    p = *List;
    while (p)
    {
        q = p->next;
        free(p);
        p = q;
    }
    *List = NULL;
}
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
#define OK 1
#define NO 0
int main()
{
/////////////////////////////
//引导
    int i;//命令字符
    int m = NO;//判断是否创建了链表
    LinkList outlist;
    while (1!=0)
    {
        printf("*创建一个链表请输入:1\n*销毁已有链表请输入:2\n*删除已有链表中结点:3\n*已有链表中插入数据:4\n*打印链表请输入:5\n*请输入命令代号以确定执行的操作:");
        scanf("%d",&i);
        fflush(stdin);
        switch (i)
        {
        case 1://创建列表操作
        {
            LinkList L;
            printf("请输入新建链表的最大结点个数(最好大于10个):");
            int n;
            scanf("%d",&n);
            fflush(stdin);
            L = creatlinklist(n);
            m = OK;
            outlist = L;
            printf("-----------------------------------------创建成功!\n");
            break;
        }
        case 3://删除结点操作
            if ( m == OK )
            {
                printf("请输入要删除第几个节点:");
                int b;
                scanf("%d",&b);
                fflush(stdin);
                deletlinklist(&outlist,b);
                printf("-----------------------------------------删除成功!\n");
            }else
            {
                printf("-----------------------------------------当前没有链表,请先创建一个链表!\n");
            }
            break;
        case 2://销毁链表操作
            if (m == OK)
            {
                destrylinklist(&outlist);
                if (outlist == NULL)
                {
                    printf("-----------------------------------------销毁成功!\n");
                    m = NO;
                }else
                {
                    printf("-----------------------------------------出现错误!\n");
                    exit(0);
                }
            }else
            {
                printf("-----------------------------------------当前没有链表可销毁,请先创建一个链表!\n");
            }
            break;
        case 4://插入结点操作
            if (m==OK)
            {
                printf("请输入要在第几个节点后插入数据:");
                int a;
                scanf("%d",&a);
                fflush(stdin);
                printf("请输入要插入的数据:");
                int j;
                scanf("%d",&j);
                insertlinklist(&outlist , a , j);
                printf("-----------------------------------------插入数据成功!\n");
            }else
            {
                printf("-----------------------------------------无链表可用,请先创建一个链表!");
            }
            break;
        case 5://打印链表操作
            printf("-----------------------------------------链表打印中...\n-----------------------------------------打印结果为:");
            LinkList List = outlist;
            while (List!=NULL)
            {
                printf("%d",List->date);
                List = List->next;
            }
            putchar('\n');
            break;
        default:
            break;
        }
    }
    
    return 0;
}

  

运行结果:

$ 实例1-3.exe
*创建一个链表请输入:1
*销毁已有链表请输入:2
*删除已有链表中结点:3
*已有链表中插入数据:4
*打印链表请输入:5
*请输入命令代号以确定执行的操作:1
请输入新建链表的最大结点个数(最好大于10个):15
请输入第1个节点存入的数据:1
请输入第2个节点存入的数据:2
请输入第3个节点存入的数据:3
请输入第4个节点存入的数据:4
请输入第5个节点存入的数据:5
请输入第6个节点存入的数据:6
请输入第7个节点存入的数据:7
请输入第8个节点存入的数据:8
请输入第9个节点存入的数据:0
-----------------------------------------创建成功!
*创建一个链表请输入:1
*销毁已有链表请输入:2
*删除已有链表中结点:3
*已有链表中插入数据:4
*打印链表请输入:5
*请输入命令代号以确定执行的操作:5
-----------------------------------------链表打印中...
-----------------------------------------打印结果为:12345678
*创建一个链表请输入:1
*销毁已有链表请输入:2
*删除已有链表中结点:3
*已有链表中插入数据:4
*打印链表请输入:5
*请输入命令代号以确定执行的操作:3
请输入要删除第几个节点:3
-----------------------------------------删除成功!
*创建一个链表请输入:1
*销毁已有链表请输入:2
*删除已有链表中结点:3
*已有链表中插入数据:4
*打印链表请输入:5
*请输入命令代号以确定执行的操作:5
-----------------------------------------链表打印中...
-----------------------------------------打印结果为:1245678
*创建一个链表请输入:1
*销毁已有链表请输入:2
*删除已有链表中结点:3
*已有链表中插入数据:4
*打印链表请输入:5
*请输入命令代号以确定执行的操作:4
请输入要在第几个节点后插入数据:2
请输入要插入的数据:3
-----------------------------------------插入数据成功!
*创建一个链表请输入:1
*销毁已有链表请输入:2
*删除已有链表中结点:3
*已有链表中插入数据:4
*打印链表请输入:5
*请输入命令代号以确定执行的操作:5
-----------------------------------------链表打印中...
-----------------------------------------打印结果为:12345678
*创建一个链表请输入:1
*销毁已有链表请输入:2
*删除已有链表中结点:3
*已有链表中插入数据:4
*打印链表请输入:5
*请输入命令代号以确定执行的操作:2
-----------------------------------------销毁成功!
*创建一个链表请输入:1
*销毁已有链表请输入:2
*删除已有链表中结点:3
*已有链表中插入数据:4
*打印链表请输入:5
*请输入命令代号以确定执行的操作: