• 单链表代码(指针实现)


    #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; }
  • 相关阅读:
    JavaEE 7学习笔记
    RX232串口发送
    以8位并行数据为例确定crc-32的一般矩阵表示形式
    nios ii 13 主程序的函数可以用Open Declaration 查看,但是编译的时候却说 undefined reference to 。。。这是为什么?
    做uart 实验时,run configure 只能选择jtag_uart 而没有uart
    在做nios ii uart232 实验时出现undefined reference to `fclose'等错误。
    修改quartus 配置rom时memory很小的问题。
    关于VGA显示实验的问题
    Microsoft Visual Studio 2013 已停止工作的解决方法
    独家原创,拖拽任意控件移动任意目标,拖拽控件移动整个窗体
  • 原文地址:https://www.cnblogs.com/demonxian3/p/7119027.html
Copyright © 2020-2023  润新知