zoukankan      html  css  js  c++  java
  • 单链表代码(指针实现)

    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
    #define OK 1
    #define ERROR 0
    #define OVERFLOW -2
    
    typedef int ElemType;
    typedef int Status;
    typedef struct Node{
      ElemType data;
      struct Node * next;
    } Node;
    
    typedef struct Node* Link;    //定义链表指针结构类型
    
    //Link L  表示声明一个单链表结构体的指针
    //Link *L 表示声明一个存放单链表结构体指针的指针
    //头结点Link的存在是因为方便同一管理和操作数据。

    /***********************
        头插法创表
    输入:链表指针,初始化个数
    输出:状态码
    功能:头插法创建链表
    ************************/
    Status createHead(Link *L,int num){ srand(time(0)); Link link = *L; Link new; link->data = 0; link->next = NULL; int i; for(i=0;i<num;i++){ new = (Link)malloc(sizeof(Node)); new->data = rand()%100+1; new->next = link->next; link->next = new; } return OK; }

    /***********************
         尾插法创表
    输入:链表指针,初始化个数
    输出:状态码
    功能:尾插法创建链表
    ************************/
    Status createTail(Link * L,int num){ Link tmp,new,link; srand(time(0)); link = *L; link->data=0; link->next=NULL; tmp = link; int i; for(i=0;i<num;i++){ new = (Link)malloc(sizeof(Node)); new->data = rand()%100+1; new->next = tmp->next; tmp->next = new; tmp=tmp->next; } return OK; }
    /***********************
         插入节点
    输入:链表指针,插入位置,插入值
    输出:状态码
    功能:在指定的位置上插入指定的值
    ************************/
    Status insertLink(Link * L,int index,ElemType e){ index--; Link new,tmp = *L; int i=0; while( tmp && i<index ){ tmp=tmp->next; i++; } if( !tmp || i>index ){ printf("overflow "); return OVERFLOW; } new=(Link)malloc(sizeof(Node)); new->data = e; new->next = tmp->next; tmp->next = new; return OK; }
    /***********************
         删除节点
    输入:链表指针,删除位置
    输出:状态码
    功能:在指定的位置上删除指定的值
    ************************/

    Status deleteLink(Link *L,int index,ElemType *e){ index--; Link net,tmp = *L; int i=0; while( tmp && i<index){ tmp=tmp->next; i++; } if( !tmp || i>index){ printf("overflow "); return OVERFLOW; } net = tmp->next; tmp->next = net->next; free(net); return OK; }
    /***********************
         读取数据
    输入:链表指针,读取位置,存储指针
    输出:状态码
    功能:获取指定位置的值赋予给存储指针
    ************************/
    Status getValue(Link L,int index,ElemType* e){ int i=0; index--; L=L->next; //ignore head node while(L && i<index){ L=L->next; i++; } if(!L || i>index){ printf("index is valid "); return ERROR; } *e = L->data; return OK; }
    /***********************
         释放链表
    输入:链表指针
    输出:状态码
    功能:将链表的空间全部释放
    ************************/
    Status freeLink(Link*L){ Link p,q; p = (*L)->next; while(p){ q=p->next; free(p); p=q; } (*L)->next = NULL; return OK; } /***********************
         打印链表
    输入:链表指针
    输出:状态码
    功能:将链表的值一一打印出来
    ************************/
    Status printLink(Link L){ Link p = L; if(p->next==NULL){ printf("link is empty "); return OK; } int i = 1; while(p->next){ p=p->next; //忽略头节点 printf("[%d] ",p->data); if(i%10==0)printf(" "); i++; } printf(" "); return OK; }

    /***********************
         计算个数
    输入:链表指针,目标值
    输出:(int)个数结果
    功能:计算链表中指定的目标值的个数
    ************************/
    int getCount(Link L,ElemType x){ int count = 0; while( L->next ){ L=L->next; if(L->data == x)count++; } return count; } int main(){ int index,value,num = 50; Link L = (Link)malloc(sizeof(Node)); createTail(&L,num); printLink(L); //insert printf("enter index:"); scanf("%d",&index); printf("enter value:"); scanf("%d",&value); insertLink(&L,index,value); printLink(L); //delete printf("enter index:"); scanf("%d",&index); deleteLink(&L,index,&value); printLink(L); //getvalue printf("enter index:"); scanf("%d",&index); getValue(L,index,&value); printf("value is %d ",value); //getCount printf("enter value:"); scanf("%d",&value); int c = getCount(L,value); printf("count is %d ",c); //freeLink freeLink(&L); return OK; }
  • 相关阅读:
    限制泛型可用类型,类型通配符声明,泛型方法
    泛型简介,泛型类及使用
    异常概念和处理机制,try-catch-finally,throw和throws,自定义异常
    随机验证码
    常用类--Date日期类,SimpleDateFormat日期格式类,Calendar日历类,Math数学工具类,Random随机数类
    String、StringBuffer和StringBuilder,定义一个自己的StringBuilder的类
    自动装箱和拆箱,枚举类型
    使用内部类开发一个存放数据的容器
    手推期望、方差
    ML 徒手系列 最大似然估计
  • 原文地址:https://www.cnblogs.com/demonxian3/p/7119027.html
Copyright © 2011-2022 走看看