m0_64018569 2021-11-18 16:24 采纳率: 78.6%
浏览 14
已结题

关于链表的问题,写代码。

链表的建立、插入、删除、查找等操作(按给定值进行查找);

  • 写回答

1条回答 默认 最新

  • 关注

    参考如下:

    
    #include <stdio.h>
    #include <stdlib.h>
    typedef char ElemType;
    typedef struct node 
    {
        ElemType data;
        struct node* next;
    }SlinkNode;
    
    //1初始化链表
    SlinkNode* InitLink(SlinkNode* h)
    {
        h = (SlinkNode*) malloc(sizeof(SlinkNode));
        h->next = NULL;
        return h;
    }
    
    //2尾插法
    SlinkNode* InsertLinkTail(SlinkNode* h,ElemType e)
    {
        SlinkNode* p=h->next;
        SlinkNode* t = (SlinkNode*)malloc(sizeof(SlinkNode));
        t->data = e;
        t->next = NULL;
        if(p==NULL) 
            h->next = t;
        else
        {
            while (p->next)
            {
                p = p->next;
            }
            p->next = t;
        }
        return h;
    }
    //3显示链表
    void showList(SlinkNode* h)
    {
        SlinkNode* p = h->next;
        while (p)
        {
            printf("%c ",p->data);
            p = p->next;
        }
        printf("\n");
    }
    
    //4.头插法
    SlinkNode* InsertHead(SlinkNode* h,ElemType e)
    {
        SlinkNode *t;
        t = (SlinkNode*)malloc(sizeof(SlinkNode));
        t->data = e;
        t->next = h->next;
        h->next = t;
        return h;
    }
    //5.链表的长度
    int Length(SlinkNode* h)
    {
        SlinkNode* p = h->next;
        int len=0;
        while(p)
        {
            len++;
            p = p->next;
        }
        return len;
    }
    
    //6.获取pos位置处的元素
    int GetElement(SlinkNode* h,int pos,ElemType* e)
    {
        SlinkNode* p = h->next;
        if(pos <1 || pos > Length(h) ) return 0;
        while(--pos)
        {
            p = p->next;
        }
        if(p) 
        {
            *e = p->data;
            return 1;
        }
        return 0;
    }
    
    //7.获取第一个元素e的位置
    int GetElePos(SlinkNode* h,ElemType e)
    {
        SlinkNode* p = h->next;
        int i = 1;
        while(p)
        {
            if(p->data == e) return i;
            i++;
            p = p->next;
        }
        return 0; //没找到返回0
    }
    
    //8.在pos位置插入元素
    SlinkNode* InsertAt(SlinkNode* h,int pos,ElemType e)
    {
        SlinkNode* p,*t;
        if (pos <1 || pos > Length(h))
        {
            return 0;
        }
        t = (SlinkNode*)malloc(sizeof(SlinkNode));
        t->data = e;
        p = h;
        while(--pos && p)
        {
            p = p->next;
        }
        if(p) 
        {
            t->next = p->next;
            p->next = t;    
        }
        return h;
    }
    
    //10.删除pos位置的元素
    SlinkNode* DeleteEleAt(SlinkNode* h,int pos)
    {
        SlinkNode* p,*t;
        if (pos<1 || pos >Length(h))
        {
            return h;
        }
        p = h;
        t = p->next;
        while(--pos && t)
        {
            p = t;
            t = t->next;
        }
        p->next = t->next;
        free(t);
        t = 0;
        return h;
    
    }
    
    void FreeList(SlinkNode* h)
    {
        SlinkNode* p;
        while(h)
        {
            p = h->next;
            free(h);h=0;
            h = p;
        }
    }
    
    int main()
    {
        SlinkNode* h = 0;
        int i;
        ElemType ch;
        char zm[]={'a','b','c','d','e'};
        char sz[]={'1','2','3'};
        //初始化单链表h
        h = InitLink(h);
        //尾插法插入
        for(i=0;i<5;i++)
            h = InsertLinkTail(h,zm[i]);
        //输出单链表
        showList(h);
        //头插法插入1 2 3
        for(i=0;i<3;i++)
            h = InsertHead(h,sz[i]);
    
        printf("链表长度:%d\n",Length(h));
        printf("显示链表:");
        showList(h);
    
        //显示序号为3的元素
        GetElement(h,3,&ch);
        printf("序号为3的元素:%c\n",ch);
    
        //'a'的位置
        i = GetElePos(h,'a');
        printf("a的位置:%d\n",i);
    
        //在第4位置插入*
        h = InsertAt(h,4,'*');
    
        //显示链表
        printf("在第4个位置插入*后链表数据:");
        showList(h);
    
        //删除第3个元素
        h = DeleteEleAt(h,3);
        //显示链表
        printf("删除第3个元素后链表数据:");
        showList(h);
        //释放链表
        FreeList(h);
        return 0;
    
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 11月27日
  • 已采纳回答 11月19日
  • 创建了问题 11月18日

悬赏问题

  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计