关于链表的新建,删除结点,插入结点的代码

本文介绍了一个关于链表基本操作的C语言程序,包括创建、删除、插入和打印链表,以及释放内存。文章详细解释了如何在工程环境中编译此代码,并讨论了在单独文件和整个工程中编译时出现的不同警告。此外,文章提供了代码优化建议,旨在提高程序效率和减少错误。

今天写了一段有关链表的基本操作的程序(C的),放到这大家给批评建议一下哈,,,

#include<stdio.h>
#include<stdlib.h>
struct Link* CreatList();//创建原始链表
struct Link* DelNode(struct Link* head);//删除指定的结点
struct Link* CreatNode(struct Link* head);//在指定位置插入结点
void DispLink(struct Link* head);//打印链表
void FreeList(struct Link* head);//释放单链表

struct Link
{
    int data;
    struct Link* next;
}

main()
{
    //两个整形量记录删除/插入结点的个数
    int i=0;
    int j=0;
    //两个字符用于判断是否需要删除/插入操作
    char c,d;
    struct Link *head,*p;

    head = CreatList();

    //打印出原始链表
    p = head->next;
    while(p!=NULL)
    {
        printf("%d\t",p->data);
        p=p->next;
    }
    printf("\n");

    printf("是否删除数据?(y/n)");
    scanf(" %c",&c);
    while (c=='y')
    {
        DelNode(head);
        DispLink(head);
        printf("是否继续删除数据?");
        scanf(" %c",&c);
        i++;
    }

    printf("是否添加数据?(y/n)");
    scanf(" %c",&d);
    while (d=='y')
    {
        head = CreatNode(head);
        DispLink(head);
        printf("是否继续添加新数据?(Y/N)");
        scanf(" %c",&d);
        j++;
    }

    printf("%d 个数据被删除\n",i);
    printf("%d 个数据被添加\n",j);

    FreeList(head);

 }
struct Link* CreatList()
{
    int dat,i,j=0;//这里用dat代表数据,区别于data,否则会报错
    struct Link  *head,*s,*r;//head是头指针,s是新建的结点,r是尾指针

    printf("请输入原始链表数据的个数:");
    scanf("%d",&i);
    head = (struct Link *)malloc(sizeof(struct Link));//分派空间
    if(head==NULL)
            {
                printf("No enough memory to alloc");
                exit(0);
            }
    r = head;
    printf("输入原始链表数据:");
    while(j<i)
    {
        s = (struct Link *)malloc(sizeof(struct Link));
        if(s==NULL)
            {
                printf("No enough memory to alloc");
                exit(0);
            }
        scanf("%d",&dat);
        s->data = dat;
        r->next = s;//将新建结点插入表尾
        r = s;//尾指针指向新的表尾
        j++;
    }
    r->next = NULL;

    return head;

}
struct Link* DelNode(struct Link* head)
{
    int i=0,j,e;
    //p是要删除的结点,pr是其前驱
    struct Link* p;
    struct Link* pr = head;

    printf("删除第几个节点的数据?");
    scanf("%d",&j);

    while(i != (j-1))
    {
        pr = pr->next;
        i++;
    }
    p = pr->next;//设定p是pr的后继
    pr->next = p->next;//将前驱的next指向后继的后继
    e = p->data;//e用来存放删除的数据
    free(p);//释放空间

    return head;
}
struct Link* CreatNode(struct Link* head)
{
            int dat;
            int i=0,j;
            //p是要插入的结点,pr是其前驱
            struct Link* p;
            struct Link* pr = head;

            printf("在第几个节点前插入数据?");
            scanf("%d",&j);

            p = (struct Link *)malloc(sizeof(struct Link));
            if(p==NULL)
            {
                printf("No enough memory to alloc");
                exit(0);
            }
            if(head == NULL)//如果链表是空表,则直接从第一个结点插入
            {
                head = p;
            }
            else
            {
                while(i != (j-1))
                {
                    pr = pr->next;
                    i++;
                }
            }
            printf("输入要添加的数据:");
            scanf("%d",&dat);
            p->data = dat;
            p->next = pr->next;//将新建的结点指向其后继
            pr->next = p;//将其前驱指向新建结点
            return head;
}

void DispLink(struct Link* head)
{
    struct Link* p = head->next;

    //打印链表
    while(p != NULL)
    {
        printf("%d\t",p->data);
        p = p->next;
    }
    printf("\n");
}
void FreeList(struct Link* head)
{
        if (head -> next != NULL)
        {
                FreeList(head -> next);
        }
        free(head);
}


以上的代码,放到工程里之后,编译会出现两个waring

D:\My Documents\My file\CB-C\111\main.c|15|warning: return type of 'main' is not 'int'|

D:\My Documents\My file\CB-C\111\main.c|62|warning: control reaches end of non-void function|

单个的C文档编译完全通过,不知为什么到工程里就会有waring呢?

假设链表结点数据结点类型为: struct node { int data; node *next; };1、创建一条无序链表 循环输入数据,若数值不为-1,新建结点并加入链表尾部。head 指向链表结点,p2 指向建立过程中的链表结点,p1 指向新开辟的结点 加入结点时, 分三种情况 首结点的建立 中间结点插入 尾结点的处理2、输出链表(输出链表上各个结点的值) 依次输出链表中每个结点的值。 3、链表排序 对链表中的整数结点按数值大小进行升序排序。如下图 4、链表结点插入一个结点插入链表,使链表结点数据保持升序 加入结点时, 分以下几种情况 原链表为空链表插入链表结点之前 插入链表中间 插在链表结点之后 5、链表结点删除 删除链表上具有指定值的一个结点 删除结点时, 分以下几种情况 链表为空链表 //无内容可删 待删除结点链表的首结点 //动 head 指针 删除其他结点 //包括中间结点或尾结点 6、链表逆序(升序变降序) 对链表中的整数结点按数值变为降序。如下图: 注意:不要进行降序排序,采用结点插入的方法。 7、链表拆分 将链表拆分成由奇数和偶数结点组成的两条链表,如下图链表的输出结果:奇数和=46,偶数和=140。 8、释放链表 释放链表结点所占用的存储空间。利用单向链表数据结构完成对链表的如下操作: 1、创建一条含正整数结点的无序链表 2、链表结点的输出 3、链表结点的升序排序 4、链表结点插入 5、链表结点删除 6、链表逆序(升序变降序) 7、链表拆分,将链表拆分成由奇数和偶数结点组成的两条链表 8、释放链表
最新发布
11-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值