• 单链表代码


    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    #define ERROR 1 
    #define MAX  100    //定义最大初始化长度
    #define DELAY 2        //定义延时单位秒
    
    typedef int ElemType;
    typedef int STATUS;
    typedef struct Linknode{    //单链表结构体
       int data;
       struct Linknode * next;
    } Link;
    
    
    /**********************
        创建
    输入:初始化数据个数
    输出:链表指针
    功能:返回一个带数据的链表的指针
    **********************/
    Link * createLink(int num){
      if(num<=0||num>MAX){
        printf("num is invalid,now num is set 3
    ");
        num = 3;
      }
    
      int i;
      Link * head, *tmp, *new;
     
      //初始化头结点
      head = malloc(sizeof(Link));
      printf("link[0]:");
      scanf("%d",&head->data);
      head->next = NULL;
    
      //初始化链表
      tmp = head;
      for(i=1;i<num;i++){
        new = malloc(sizeof(Link));
        printf("link[i]:");
        scanf("%d",&new->data);
    
        new->next = NULL;
        tmp->next = new;
        tmp = tmp->next;
      }
    
      return head;
    }
    
    /**********************
        查询值
    输入:链表指针,查询位置
    输出:查询结果
    功能:返回指定位置的数据
    **********************/
    ElemType getValue(Link * head,int index){
       
       index--;
    
       if(index<0 || index>=MAX){
              printf("index is invalid
    ");
        return ERROR; 
       }
    
       Link * tmp = head;
    
       int i=0;
       while(tmp){
         if(i == index){
            printf("value is %d
    ",tmp->data);
            return  1;
         }
         tmp = tmp->next;
         i++;
       }
     
       printf("sorry index is not found
    ");
       return ERROR;
    }
    
    /**********************
        查询位置
    输入:链表指针,查询值
    输出:查询结果
    功能:返回指定值的位置
    **********************/
    ElemType getIndex(Link * head,ElemType value){
    
       int i = 0;
       Link * tmp = head;
       while(tmp){
         if(tmp->data == value){
           printf("Index is %d
    ",i+1);
           return 0;
         }
         tmp=tmp->next;
         i++;
       }
       
       printf("Sorry value is not found!
    ");
       return 0;
    }
    
    /**********************
        查询节点
    输入:链表指针,查询值
    输出:节点
    功能:返回指定值的节点
    **********************/
    Link * findNode(Link * head,int value){
    
      Link * tmp = head;
      
      while(tmp){
        if(tmp->data == value)return tmp;
        tmp = tmp->next;
      }
      return NULL;
    }
    
    /**********************
        向前插入
    输入:链表指针,目标节点,插入值
    输出:链表指针
    功能:在指定位置节点的前面插入值
    **********************/
    Link * insertBefore(Link * head,Link * target,ElemType value){
       
      Link * tmp = head;
      Link * new = malloc(sizeof(Link));
      new->data=value;
      if(target == head){
        new->next = head;
        return head;
      }
    
      while(tmp->next != target)tmp=tmp->next;
      
      new->next = target;
      tmp->next = new;
    
      return head;
    } 
    
    /**********************
        向后插入
    输入:链表指针,目标节点,插入值
    输出:状态码
    功能:在指定位置节点的后面插入值
    **********************/
    STATUS insertAfter(Link * target,ElemType value){
       
       Link * new = malloc(sizeof(Link));
       new->data = value;
       new->next = target->next;
       target->next = new;
       return OK;
    }
    
    /**********************
        追加节点
    输入:链表指针,追加值
    输出:状态码
    功能:在指定位置节点的后面插入值
    **********************/
    STATUS appendNode(Link * head,ElemType value){
       
       Link * tmp = head;
       Link * new = malloc(sizeof(Link));
       new->data = value;
       new->next = NULL;
       while(tmp->next)tmp=tmp->next;
     
       tmp->next = new;
       return 0;
    }
    
    /**********************
        替换数据
    输入:链表指针,目标节点
    输出:状态码
    功能:在指定值的节点上更改数据
    **********************/
    STATUS replaceNode(Link *target,ElemType value){
       target->data=value;
       return 0;
    }
    
    /**********************
        删除节点
    输入:链表指针,目标节点
    输出:链表指针
    功能:将指定值的节点删除
    **********************/
    Link * deleteNode(Link * head,Link * target){
      
      if(head == target)return head->next;
    
      Link * tmp = head;
      while(tmp->next != target)tmp=tmp->next;
    
      tmp->next = target->next;
      return head;
    }
    
    /**********************
        释放链表
    输入:链表指针
    输出:无
    功能:将链表内存空间释放
    **********************/
    void freeLink(Link *head){
       Link * tmp = malloc(sizeof(Link));
       while(head){
         tmp = head;
         head = head->next;
         free(tmp);
       }
    }
    
    /**********************
        打印链表
    输入:链表指针
    输出:无
    功能:将链表的值一一输出
    **********************/
    void printLink(Link * head){
       Link * tmp = head;
       while(tmp){
         printf("[%d] ",tmp->data);
         tmp = tmp->next;
       }
       printf("
    ");
    }
    
    
    /**********************
        打印信息
    输入:无
    输出:无
    功能:打印链表的操作信息
    **********************/
    void printInfo(){
       system("clear");
       printf("
    ");
       printf("---------------------------
    ");
       printf("        a = append         
    ");
       printf("        g = getValue       
    ");
       printf("        G = getIndex       
    ");
       printf("        i = insertBefore   
    ");
       printf("        I = insertAfter    
    ");
       printf("        r = replace        
    ");
       printf("        d = delete         
    ");
       printf("        e = exit           
    ");
       printf("===========================
    ");
    }
    
    
    int main(){
      int num,index,value;
      char select;
      printf("how many num are you want:");
      scanf("%d",&num);
      Link * head = createLink(num);
      Link * tmp  = malloc(sizeof(Link));
    
      while(1){
        printInfo();
        printLink(head);
        printf("please enter your choose:");
        select = getchar();
        
        if(select == 'a'){
        printf("please enter value:");
        scanf("%d",&value);
        appendNode(head,value);
        }
    
        else if(select == 'r'){
        printf("please enter old value:");
        scanf("%d",&value);
        tmp = findNode(head,value);
        printf("please enter new value:");
        scanf("%d",&value);
        replaceNode(tmp,value);
        }
    
        else if(select == 'g'){
        printf("please enter index:");
        scanf("%d",&index);
        getValue(head,index);
        sleep(DELAY);
        }
    
        else if(select == 'G'){
        printf("please enter value:");
            scanf("%d",&value);
         getIndex(head,value);
        sleep(DELAY);
        }
       
        else if(select == 'i'){
            printf("enter the old value:");
        scanf("%d",&value);
        tmp = findNode(head,value);
        if(!tmp){
          printf("Sorry value is not found
    ");
          sleep(DELAY);
          continue;
        }
        printf("enter the new value:");
        scanf("%d",&value);
        head = insertBefore(head,tmp,value);
        }
    
        else if(select == 'I'){
            printf("enter the old value:");
        scanf("%d",&value);
        tmp = findNode(head,value);
        if(!tmp){
          printf("sorry value is not found
    ");
          sleep(DELAY);
          continue;
        }
        printf("enter the new value:");
        scanf("%d",&value);
        insertAfter(tmp,value);
        }
        
        else if(select == 'd'){
        printf("enter the old value:");    
        scanf("%d",&value);
        tmp = findNode(head,value);
        head = deleteNode(head,tmp);
        }
    
        else if(select == 'e'){
           free(head);
           exit(0);
        }
      }
    
    }
    
     
  • 相关阅读:
    Dart Learn Notes 04
    Dart Learn Notes 03
    Dart Learn Notes 02
    一介书生,仅此而已
    计算机技术的演进及编程语言的多样
    C#方法(用法,参数)
    C#数组--(Array类的属性和方法)
    C#数组--(一维数组,二维数组的声明,使用及遍历)
    程序设计的编程方法
    C#流程控制语句--跳转语句(break,continue,goto,return,)
  • 原文地址:https://www.cnblogs.com/demonxian3/p/7119022.html
Copyright © 2020-2023  润新知