zoukankan      html  css  js  c++  java
  • 单链表的基本操作(查找,插入,删除)

    这周老师给的作业跟上周貌似差不多。只是用了单链表。

    完成单链表的基本操作函数。
    1)      初始化单链表
    2)      给定的数据元素存放在一维数组中,分别完成头插法和尾插法建立单链表
    3)      将数据元素从键盘依次输入,分别完成头插法和尾插法建立单链表
    4)      输出单链表的长度
    5)      实现按位查找和按值查找
    6)      实现插入和删除操作
    7)      实现遍历单链表操作
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    //查找1.内容2.序号
    //插入
    //删除
    typedef struct student
    {
     int num;
     char name[10];
    }STU;
    typedef struct Node
    {
     STU data;
     struct Node * next;
    }Node;
    
    void denglu(Node *L);//登录函数
    void chazhao(Node *L);//查找函数
    void Printf(Node *L);//输出函数
    void CreateFromHead(Node *L);//头插法
    void CreateFormTail(Node *L);//尾插法
    void panduan(Node *L);//判断头插还是尾插
    void Get(Node *L);//按序号结点查找
    void Locate(Node *L);//按内容查找(值)
    void Inslist(Node *L);//插入
    void Dellist(Node *L);//删除
    
    void Dellist(Node *L)//删除
    {
     system("CLS");
     int n;
     printf("请输入要删除的结点
    ");
     scanf("%d",&n);
     if(n<=0){
      printf("输入的数据不合法,请重新输入
    ");
      Dellist(L);
     }
     Node *pre,*r;
     int k=0;
     pre=L;
     while(pre->next !=NULL&&k<n-1){
      pre=pre->next;
      k=k+1;
     }
     if(pre->next==NULL){
      printf("没有找到该结点,请重新输入
    ");
      Dellist(L);
     }
     r=pre->next;
     pre->next=r->next;
     free(r);
     printf("删除成功!
    ");
     denglu(L);
    }
    void Inslist(Node *L)//插入
    {
     system("CLS");
     int n;
     printf("请输入在第几个位置插入数据
    ");
     scanf("%d",&n);
     printf("请输入插入的学号,姓名
    ");
     int num1;
     char name1[10];
     scanf("%d %s",&num1,name1);
     Node *pre,*s;
     int k=0;
     if(n<=0){
      printf("输入的数据不合法,请重新输入
    ");
      Inslist(L);
     }
     pre=L;
     while(pre!=NULL&&k<n-1){
      pre=pre->next;
      k=k+1;
     }
     if(pre==NULL){
      printf("无法找到该节点,请重新输入
    ");
      Inslist(L);
     }
     s=(Node*)malloc(sizeof(Node));
     strcpy(s->data .name ,name1);
     s->data.num=num1;
     s->next =pre->next ;
     pre->next =s;
     printf("插入成功!
    ");
     denglu(L);
    }
    
    
    void Locate(Node *L)//按内容查找(值)
    {
     system("CLS");
     int n;
     printf("请输入要查找的学号
    ");
     scanf("%d",&n);
     Node *p;
     p=L->next;
     while(p!=NULL){
      if(p->data.num!=n){
       p=p->next;
      }else
       break;
     }
     printf("你要查找的学号所对应的信息为%d %s
    ",p->data.num,p->data.name);
     denglu(L);
    }
    void Get(Node *L)//按序号结点查找
    {
     system("CLS");
     int n;
     printf("请输入你要查找的结点
    ");
     scanf("%d",&n);
     if(n<=0){
      printf("输入的数据不合法,请重新输入
    ");
      Get(L);
     }
     Node *p;
     p=L;
     int j=0;
     while((p->next!=NULL)&&(j<n)){
      p=p->next;
      j++;
     }
     if(n==j){
      printf("你要查找的结点的储存位置的数据为%d %s
    ",p->data.num,p->data.name);
     }
     denglu(L);
    }
    void Printf(Node *L)
    {
     int q=0;
     Node *p=L->next;
     while(p!=NULL)
     {
      q++;
      printf("%d %s
    ",p->data.num,p->data.name);
      p=p->next;
     }
     printf("单链表长度为%d
    ",q);
     denglu(L);
    }
    void chazhao(Node *L)
    {
        printf("1.按序号查找
    ");
        printf("2.按内容查找
    ");
        printf("3.返回主界面
    ");
        int aa;
        scanf("%d",&aa);
        switch(aa){
            case 1:Get(L);
            case 2:Locate(L);
            case 3:denglu(L);break;
            default:
                     printf("输入错误请重新输入
    ");
                     chazhao(L);
        }
    }
    
    void denglu(Node *L)
    {
        int a;
        printf("请选择你要做什么
    ");
        printf("1.查找
    ");
        printf("2.插入
    ");
        printf("3.删除
    ");
        printf("4.打印现有的学生信息及单链表长度
    ");
        printf("5.退出
    ");
        scanf("%d",&a);
        switch(a){
            case 1:chazhao(L);
            case 2:Inslist(L);
            case 3:Dellist(L);
            case 4:Printf(L);
            case 5:printf("谢谢使用
    ");exit(0);
            default:
                     printf("输入错误请重新输入
    ");
                     denglu(L);
        }
    }
    void CreateFromHead(Node *L)//头插法
    {
     Node *s;
     int n;//n为元素个数
     printf("请输入元素个数
    ");
     scanf("%d",&n);
     printf("请输入学号姓名
    ");
     for(int i=1;i<=n;i++)
     {
      s=(Node *)malloc(sizeof(Node));
      scanf("%d %s",&s->data.num,s->data.name);
      s->next=L->next;
      L->next=s;
     }
    }
    void CreateFormTail(Node *L)//尾插法
    {
     Node *s,*r;
     r=L;
     int n;//n为元素个数
     printf("请输入元素个数
    ");
     scanf("%d",&n);
     printf("请输入学号姓名
    ");
     for(int i=1;i<=n;i++)
     {
      s=(Node *)malloc(sizeof(Node));
      scanf("%d %s",&s->data.num,s->data.name);
      r->next=s;
      r=s;
      if(i==n){
       r->next=NULL;
      }
     }
    }
    Node *InitList(Node *L)//初始化单链表
    {
     L=(Node *)malloc(sizeof(Node));
     L->next=NULL;
     return L;
    }
    void panduan(Node *L)
    {
     int q;
     printf("请选择用哪种方式建立链表
    ");
     printf("1.头插法
    ");
     printf("2.尾插法
    ");
     scanf("%d",&q);
     switch(q){
          case (1):
        CreateFromHead(L);
        printf("输入成功!
    ");
        break;
       case (2):
        CreateFormTail(L);
        printf("输入成功!
    ");
        break;
       default:
        printf("输入错误请重新输入
    ");
        panduan(L);
     }
    }
    
    
    int main()
    {
        Node *L=NULL;
        L=InitList(L);
        panduan(L);
        denglu(L);
    
        return 0;
    }
    

    ps.贴上来的代码空格有点小奇怪啊。不用应该没什么太大影响。= =处女座强迫症伤不起 。

  • 相关阅读:
    Python的包管理工具Pip
    C语言移位运算符
    malloc函数具体解释
    HDU
    Java中Scanner的使用方法
    DOS call 中的%cd%,当前文件夹演示
    没有找到MSVCR100.dll解决方法
    什么是响应式表格(响应式表格和普通表格的区别)
    Redis和Memcache和MongoDB简介及区别分析(整理)
    GIT将本地项目上传到Github(两种简单、方便的方法)
  • 原文地址:https://www.cnblogs.com/xzt6/p/5906320.html
Copyright © 2011-2022 走看看