数据结构与算法-实验1链表的建立与操作

简介: 1. 掌握链表的数据结构2. 建立空链表3. 用头插法向链表插入数据,实验数据:验证数据:20,20,17,16,15,15,11,10,8,7,7,5,44. 依次输出链表中的数据5. 利用链表原空间进行对链表进行反转6. 依次输出反转后的链表数据,以判断反转操作的正确性,注意反转后,链表的第一个和最后一个元素是否正确7,进阶要求:删除无序链表的重复元素。

实验目的: 掌握链表数据结构的建立及操作

实验重点: 利用链表的原空间进行链表的反转

实验内容:设计一个将输入数据建立成链表、并依次输出链表数据、利用原空间把链表反转的程序。

实验步骤

    1. 掌握链表的数据结构
    2. 建立空链表
    3. 用头插法向链表插入数据,实验数据:
      验证数据:20,20,17,16,15,15,11,10,8,7,7,5,4
    4. 依次输出链表中的数据
    5. 利用链表原空间进行对链表进行反转
    6. 依次输出反转后的链表数据,以判断反转操作的正确性,注意反转后,链表的第一个和最后一个元素是否正确

    7,进阶要求:删除无序链表的重复元素。

    实验提示:

    见ppt

    程序流程图

    image.gif编辑

    程序代码

    #include<stdio.h>
    #include<stdlib.h>
    #include<conio.h>
    typedef struct Number{
        int num;
    }Num;
    typedef struct NumNode{
        Num number;
        struct NumNode*pNext;
    }Node;
    Node *g_head=NULL;
    Node *prev = NULL;
    void inputnumber();
    void printnumber();
    void reverse();
    void dele();
    void freelink();
    int main(){
        while(1){
            int n;
            printf("请选择功能\n");
            printf("1.输入链表数据\n");
            printf("2.反转链表\n");
            printf("3.删除链表相同元素\n");
            printf("4.输出链表数据\n");
            scanf("%d",&n);
            if(n==1)
                inputnumber();
            else if(n==2)
          reverse();   
        else if(n==3)
          dele();
        else if(n==4)
                printnumber();
        }
        void freelink();
        return 0;
    }
    void inputnumber(){
      int q,i=0;
      printf("请输入链表元素个数:"); 
      scanf("%d",&q);
        while(i<q){
          //头插法建立空链表 
        Node* pnewNode=(Node*)malloc(sizeof(Node));
        scanf("%d",&pnewNode->number.num);
        pnewNode->pNext=g_head;
        g_head=pnewNode;
        i++;
      }
      printf("\n");
      system("pause");
    }
    void printnumber(){
        Node *p=g_head;
        while(p!=NULL){
            printf("%d  ",p->number.num);
            p=p->pNext;
        }
      //printf("%d",g_head->number.num);
      printf("\n\n");
      system("pause");
    }
    void reverse(){   
        Node *curr =g_head;   
        while (curr != NULL) {  
            Node *nextTemp = curr->pNext;
            curr->pNext = prev;
            prev = curr;
            curr = nextTemp;
        }
        g_head=prev;
        printf("链表反转成功\n\n");
        system("pause");
    }
    void dele(){
      Node *p=g_head,*q=NULL,*r=NULL,*t=NULL;
        while(p!=NULL){
          q=p;
          r=q->pNext;
          while(r!=NULL){
            if(r->number.num==p->number.num){
              t=r;
              r=r->pNext;
              q->pNext=r; 
              free(t);
          }
          else{
            q=r;
            r=r->pNext;
          }
        }
        p=p->pNext;
      }
      printf("删除相同元素成功\n\n");
      system("pause");
    }
    void freelink(){
      Node *p;
      while(g_head!=NULL){
        p=g_head;
        g_head=p->pNext;
        free(p);
      }
    }

    image.gif

    运行结果及分析

    image.gif编辑

    头插法进行链表元素的输入,然后输出链表,对链表进行反转,然后输出,对链表进行相同元素的删除和内存的释放,然后输出。

    image.gif编辑

    头插法进行链表元素的输入,然后输出链表,对链表进行相同元素的删除和内存的释放,然后输出。对链表进行反转,然后输出。

    心得体会

    对C语言的链表进行深刻复习,进一步加强了链表的建立和删除与反转,而且对链表的结构和算法进行深度学习,对算法有了初步的学习,得以加强。

    相关文章
    |
    7天前
    |
    Java
    java数据结构,双向链表的实现
    文章介绍了双向链表的实现,包括数据结构定义、插入和删除操作的代码实现,以及双向链表的其他操作方法,并提供了完整的Java代码实现。
    java数据结构,双向链表的实现
    |
    29天前
    |
    存储 Java 索引
    【数据结构】链表从实现到应用,保姆级攻略
    本文详细介绍了链表这一重要数据结构。链表与数组不同,其元素在内存中非连续分布,通过指针连接。Java中链表常用于需动态添加或删除元素的场景。文章首先解释了单向链表的基本概念,包括节点定义及各种操作如插入、删除等的实现方法。随后介绍了双向链表,说明了其拥有前后两个指针的特点,并展示了相关操作的代码实现。最后,对比了ArrayList与LinkedList的不同之处,包括它们底层实现、时间复杂度以及适用场景等方面。
    42 10
    【数据结构】链表从实现到应用,保姆级攻略
    |
    2月前
    |
    存储 算法
    【初阶数据结构篇】顺序表和链表算法题
    此题可以先找到中间节点,然后把后半部分逆置,最近前后两部分一一比对,如果节点的值全部相同,则即为回文。
    |
    2月前
    |
    存储 测试技术
    【初阶数据结构篇】双向链表的实现(赋源码)
    因为头结点的存在,plist指针始终指向头结点,不会改变。
    |
    2月前
    |
    存储 测试技术
    【初阶数据结构篇】单链表的实现(附源码)
    在尾插/尾删中,都需要依据链表是否为空/链表是否多于一个节点来分情况讨论,目的是避免对空指针进行解引用造成的错误。
    |
    2月前
    |
    算法
    【数据结构与算法】共享双向链表
    【数据结构与算法】共享双向链表
    13 0
    |
    2月前
    |
    算法
    【数据结构与算法】双向链表
    【数据结构与算法】双向链表
    13 0
    |
    2月前
    |
    算法
    【数据结构与算法】循环链表
    【数据结构与算法】循环链表
    15 0
    |
    2月前
    |
    存储 算法
    【数据结构与算法】链表
    【数据结构与算法】链表
    18 0
    |
    4天前
    |
    算法 安全 测试技术
    golang 栈数据结构的实现和应用
    本文详细介绍了“栈”这一数据结构的特点,并用Golang实现栈。栈是一种FILO(First In Last Out,即先进后出或后进先出)的数据结构。文章展示了如何用slice和链表来实现栈,并通过golang benchmark测试了二者的性能差异。此外,还提供了几个使用栈结构解决的实际算法问题示例,如有效的括号匹配等。
    golang 栈数据结构的实现和应用
    下一篇
    无影云桌面