zoukankan      html  css  js  c++  java
  • 数据结构C语言版--单链表的基本功能实现

    /*
    * 构造一个链式存储的线性表(当输入9999时,结束构造过程),然后输出该线性表
    * 并统计该线性链表的长度 。
    *注:new和delete是C++的运算符
        malloc和free是C++/C的标准库函数 
    */ 
    #include<stdio.h>
    #define OK 1
    #define ERROR 0
    #define TRUE 1
    #define FALSE 0
    //单链表的存储结构 
    struct LinkNode{
        int data;                   //节点的数据域 
        struct LinkNode *next;      //节点的指针域 
    }; 
    
    //1.打印输出,链表的数据,其中链表指向头节点 
    void print(LinkNode *L){
        LinkNode *p;        //定义一个指针变量p 
        p = L->next;        //使p指向链表L的第一个数据 
        while(p != 0){
            printf("%d、",p->data);
            p = p->next;    //指针后移 
        }
        printf("
    ");       //换行 
    }
    
    //2.链表长度
    int Length_LinkList(LinkNode *L){
        LinkNode *p;                    //定义一个指针变量 
        int len = 0;                    //  定义一个计数器,计算节点个数 
        p = L->next;                    //指针P指向链表的第一个节点 
        while(p != NULL){
            len++ ;     
            p = p->next;                //指针后移,即指向当前节点的后继节点 
        }
        return len;                     //返回链表长度 
    } 
    
    //3.按位置查找,单链表中寻找第i个元素,返回指向第i个节点的指针
    LinkNode* FindI_LinkNode(LinkNode *L,int i){
        LinkNode *p;        //定义指针变量 
        int j = 1;          //定义计数器 
        p = L->next;        //让p指向头节点 
        while(j < i){       //当没有找到第i个节点 
            p = p->next;    //指针后移 
            j++;            //计数器加一 
        }
        return p;   
    } 
    //4.按值查找,单链表中寻找元素e,返回元素e所在的位置 
    int FindE_LinkNode(LinkNode* L,int e){
        LinkNode *p;
        int count=0;
        p=L->next;
        while(p != NULL)                             
        {
          count++;
          if(p->data==e)
            return (count);
          p=p->next;
        }
        return 0;
    } 
    //5.在表头插入数据 
    int Insert_head(LinkNode* &L,int x){
        //在以H为头节点的单链表中在头节点后插入数据 
        LinkNode *t;        //定义指针
        t = new LinkNode;   //申请空间 
        t->data = x;        //向新节点中写入数据 
        t->next = L->next;  //把链表的第一个节点的地址写入到新节点中,也就是新节点的指针域置为null 
        L->next = t;        //让头节点的next指针指向新节点 ,把新节点接到链表上 
        return OK;
    } 
    
    //6.在表尾插入数据
    int Insert_end(LinkNode *L,int x){
        LinkNode *t; 
        t = new LinkNode;   //申请空间 
        t->data = x;        //把数据赋到新节点的数据域 
        while(L->next != NULL){//当链表不为空时,指针向后移动,因为数据要插入最后一个位置 
            L = L->next;    //指针向后移动 
        }                   //直到指针移到最后一个 
        L->next = t;        //将链表末尾节点的下一节点指向新节点 
        t->next = NULL;     //新节点的指针域置空 
        return OK;
    } 
    
    //7.在第i个位置插入数据
    int Insert_LinkNode(LinkNode *L,int i,int x){
        if(i < 1 || i > Length_LinkList(L)){
            printf("插入位置错误!
    ");
            return ERROR; 
        }
        LinkNode *p; 
        if(i == 1)
            p = L;                      //指针P指向头节点 
        else                            
            p = FindI_LinkNode(L,i-1);  //让P指向第i-1个节点
        Insert_head(p,x);               //将x插入假设以p节点为头节点的链表中
        return OK; 
    } 
    
    //8.删除首元节点
    int Del_Head(LinkNode *L){
        if(L->next != NULL){
            LinkNode *p;                //定义一个指针变量 
            p = L->next;                //指针p指向第一个节点,p->next指向下一个节点 
            L->next = p->next;          //头节点的指针域存储第二个节点的地址 
            delete p;                   //删除第一个节点,释放空间 
        }else{
            printf("空表!
    ");
            return FALSE;
        }
    } 
    //9.删除表尾节点
    int Del_End(LinkNode *L){
        if(L->next != NULL){
            LinkNode *p; 
            LinkNode *q;
            int i; 
            p = L->next;                    //指针p指向第一个节点
    
            for(i = 1;i < Length_LinkList(L) - 1;i++){
                p = p->next;
            }
            q = p->next;
            p->next = NULL;
            //free(q);
            delete q;
        }else{
            printf("空表!"); 
        }
    
    }  
    //10.删除指定位置上的元素
    int Del_i(LinkNode* L,int i){
        if(i<1 || i>Length_LinkList(L))//如果删除位置不合法
        {   
            printf("删除位置不合法!"); 
            return 0;
        }
        LinkNode *p;
        if(i==1)    
            p=L;                        //让p指向头结点   
        else            
            p=FindI_LinkNode(L,i-1);    //让p指向第i-1个结点   
        Del_Head(p);                    //删除以p为头结点的链表的第一个数据结点
        return OK;
    }
    
    /*
    * 在主函数中传递参数,传参分为值传递和址传递,  
    */ 
    int main(){
        int i,x,count,m;
        LinkNode *H;                //定义链表指针
        LinkNode *add;  
        H = new LinkNode;               //申请空间 
        //H->data = -1;                 //为成员变量数据赋值 
        H->next = NULL;                 //为成员变量指针赋值 
        printf("输入数据:
    ");
        while(1){
            scanf("%d",&i);
            if(i == 9999){
                break; 
            }else{
                Insert_end(H,i);    //插入数据 
            }
        } 
        printf("The LinkNode elem is:");
        print(H);                       //输出数据
        printf("1.请输入从表头插入的数据:");
        scanf("%d",&i); 
        Insert_head(H,i);
        printf("The LinkNode elem is:");
        print(H);
        printf("2.请输入从表尾插入的数据:");
        scanf("%d",&i); 
        Insert_end(H,i);
        printf("The LinkNode elem is:");
        print(H);
        printf("3.请输入要插入的位置、数据(空格隔开):
    ");//判断输出的插入位置是否合法 
        scanf("%d %d",&i,&x);
        Insert_LinkNode(H,i,x); 
        printf("The LinkNode elem is:");
        print(H);
        printf("4.请输入要查询的位置:");
        scanf("%d",&i);
        if(i < 1 || i > Length_LinkList(H)){    //若查询位置不合法,返回error 
            printf("查询位置不合法!
    ");   
        }else{
            add = FindI_LinkNode(H,i);
            int e = add->data;
            printf("位置:%d的数据是:%d
    ",i,e);
        }
        printf("4.请输入要查询的元素:
    ");
        scanf("%d",&i);
        m = FindE_LinkNode(H,i);
        if(m == 0){
            printf("查无此元素!
    ");
        }else{
            printf("数据:%d所在的位置是:%d
    ",i,m);
        }
        Del_Head(H);
        printf("5.删除首元节点后:
    The LinkNode elem is:");
        print(H);  
        Del_End(H);
        printf("6.删除表尾节点后:
    The LinkNode elem is:");
        print(H); 
        printf("7.指定删除节点的位置:
    ");
        scanf("%d",&i); 
        if(i < 1 || i > Length_LinkList(H)){    //若查询位置不合法,返回error 
            printf("指定位置不合法!
    ");   
        }else{
            Del_i(H,i);
            printf("6.删除指定节点后:
    The LinkNode elem is:");
            print(H);
        }
        count = Length_LinkList(H);
        printf("8.此链表长度为:%d
    ",count);
        return 0; 
    }
  • 相关阅读:
    注册表修改大全(浏览文章时可以使用CTRL+F查找)
    怎样彻底删除系统服务项
    Linux查看文件编码格式及文件编码转换
    使用回收站主键名、索引名问题
    Aix5.3安装Bash Shell环境
    让AIX下的sqlplus也支持回显功能
    Oracle查看表空间使用率SQL脚本
    笔记本电脑内网、外网一起使用
    Oracle数据库为何出现乱码
    Oracle中varchar2(20)和varchar2(20 byte)区别
  • 原文地址:https://www.cnblogs.com/tengpengfei/p/10454032.html
Copyright © 2011-2022 走看看