qq_42563890 2021-12-17 20:15 采纳率: 80%
浏览 131
已结题

C语言程序设计(单链表的基本操作)

用结构体和指针实现一个单链表的基本操作程序link.c,主要包括以下功能模块:
1.系统菜单模块设计(MenuLine() )。为了在主函数(main())反复执行上图图1单链表子系统的各操作函数,我们在主函数中用循环语句实现此功能,并设计了一个菜单显示各功能选项,用函数MenuLine() 表示
2.单链表的类型定义(typedef struct linknode )。
typedef int DataType; /定义DataType为int类型/
typedef struct linknode /单链表存储类型/
{
DataType data; /定义结点的数据域/
struct linknode *next; /定义结点的指针域/
} LinkList;
3.单链表的初始化(LinkList *InitList())。
LinkList *InitList()
{ /初始化链表函数/
LinkList head;
head=(LinkList
)malloc(sizeof(LinkList)); /动态分配一个结点空间/
head->next=NULL;
return head; /头结点L指针域为空,表示空链表/
}
4.显示输出链表函数(void DispList(LinkList *head))。
5.建立链表函数( void CreateList(LinkList *head,int n)),要求建立后显示输出链表。
6.按位置插入元素函数(void InsList(LinkList *head, int i, DataType x)),要求插入后显示输出链表。。
(7)按位置删除链表中元素函数(void DelList(LinkList *head,int i)),要求删除后显示输出链表。
(8)在链表中按位置查找元素(void SearchList(LinkList *head,int i))。
(9)在链表中查找值为x的元素位置(Locate(void LinkList *head,DataType x))。
(10)求链表长度函数(int LengthList(LinkList *head))。
软件:Visual C++ 6.0

  • 写回答

1条回答 默认 最新

  • 关注

    如下:
    search函数和locate函数你在main函数中调用一下就可以了。

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef int DataType; /*定义DataType为int类型*/
    typedef struct linknode  
    {
        DataType data;
        struct linknode * next;
    }LinkList;
    //创建线性表
    LinkList * CreateList()
    {
        int i,n;
        struct linknode * head,*p,*t;
        head = (struct linknode *)malloc(sizeof(linknode ));
        head->next = NULL;
        t = head;
        printf("请输入链表的长度:");
        scanf("%d",&n);
        printf("请输入链表数据:");
        for (i=0;i<n;i++)
        {
            p = (struct linknode *)malloc(sizeof(linknode ));
            scanf("%d",&(p->data));
            p->next = NULL;
            t->next = p;
            t = p;
        }
        return head;
    }
    
    int LengthList(LinkList *head)
    {
        LinkList* p ;
        int len =  0;
        if (head == 0)
        {
            return 0;
        }
        p = head->next;
        while (p)
        {
            len++;
            p = p->next;
        }
        return len;
    }
    
    
    //插入
    LinkList * InsList(LinkList *head,int pos,DataType data)
    {
        struct linknode * p = head,*t;
        int i=1;
        if(pos <1 || pos > LengthList(head))
        {
            printf("插入位置错误");
            return head;
        }
        while(i<pos && p)
        {
            p = p->next;
            i++;
        }
        if (p)
        {
            t = (struct linknode *)malloc(sizeof(linknode ));
            t->data = data;
            t->next = p->next;
            p->next = t;
            printf("插入成功\n");
        }else
            printf("插入位置不合适,插入失败\n");
    
        return head;
    }
    
    //删除
    LinkList * DelList(LinkList* head,int pos)
    {
        int i = 1;
        struct linknode * p = head,*t;
        if (pos < 0 || pos > LengthList(head))
        {
            printf("删除位置错误");
            return head;
        }
        while(i<pos && p)
        {
            p = p->next;
            i++;
        }
        if (p)
        {
            t = p->next;
            p->next = t->next;
            free(t);
            t = 0;
            printf("删除成功\n");
        }else
            printf("删除成功\n");
        return head;
    }
    
    
    //显示
    void DispList(LinkList * head)
    {
        struct linknode * p = head->next;
        while(p)
        {
            printf("%d ",p->data);
            p = p->next;
        }
        printf("\n");
    }
    
    
    //在链表中按位置查找元素
    void SearchList(LinkList *head,int pos)
    {
        LinkList* p;
        int i = 1;
        if (p<0 || pos > LengthList(head))
        {
            printf("位置错误");
            return;
        }
        p = head->next;
        while (p && i!= pos)
        {
            p = p->next;
            i++;
        }
        if(p)
        {
            printf("查找到的数据为:%d\n",p->data);
        }else
            printf("未找到\n");
    }
    
    
    //查找位置
    
    void Locate(LinkList *head,DataType x)
    {
        LinkList* p;
        int i=1;
        if(head == 0)
        {
            printf("链表为空\n");
            return ;
        }
        p = p->next;
        while(p)
        {
            if (p->data == x)
            {
                printf("%d所在位置:%d\n",x,i);
                return ;
            }else
            {
                i++;
                p = p->next;
            }
        }
        printf("未找到该元素\n");
        return ;
    }
    
    
    
    //释放空间
    void Free(LinkList * head)
    {
        struct linknode * p;
        while(head)
        {
            p = head->next;
            free(head);
            head = p;
        }
        head = 0;
    }
    
    int main()
    {
        int pos,data;
        struct linknode * head = CreateList();
        DispList(head);
    
        //插入
        printf("请输入插入位置(从1开始)和数据:");
        scanf("%d %d",&pos,&data);
        head = InsList(head,pos,data);
        printf("插入后链表数据:");
        DispList(head);
    
        //删除
        printf("请输入删除位置(从1开始):");
        scanf("%d",&pos);
        head = DelList(head,pos);
        printf("删除后链表数据:");
        DispList(head);
    
        //释放空间
        Free(head);
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月26日
  • 已采纳回答 12月18日
  • 创建了问题 12月17日

悬赏问题

  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥20 测距传感器数据手册i2c