zoukankan      html  css  js  c++  java
  • 数据结构——单链表

    include<stdio.h>

    include<stdlib.h>

    typedef struct node{ //定义
    int data;
    struct node link;
    }Linknode,
    LinkList;

    void  construct(LinkList &L,int ending){                  //单链表初始化,赋值 (尾插法) 
     	int val;
     	printf("请输入数据:"); 
     	scanf("%d",&val);
     	if(val==ending) { 
    	  L=NULL;
    	  printf("此链表为空!") ;
    	  return;
    	  } 
    	else {
        	L=(Linknode*)malloc(sizeof(Linknode));               //创建头节点 
     	if(!L){
     		printf("存储分配失败!");
    		 exit(1);                                                        //返回 
    	 }
    	 L->data=val;
    	 construct(L->link,ending);                               //L=L->link; 
            }
        }
     	 	
    void length(LinkList &L){                                       //计算链表长度 
    	Linknode *p=L->link;                                         //p指向第一个节点 
    	int num=0;                                                        //num表示链表长度 
    	while(p!=NULL){                     
    		p=p->link;
    		num++;
    	}
    	printf("链表的长度为:%d
    ",num);
    }
    

    void locatedata(LinkList &L){ //根据逻辑序号查找对应的数据
    int a,j=1;
    Linknode *p=L->link; //p指向第一个节点
    printf("请输入要查找元素的逻辑序号:");
    scanf("%d",&a);
    printf(" ");
    while(p!=NULL&&j<a){
    p=p->link;
    j++;
    }
    if(p==NULL){
    printf("逻辑序号超出链表长度! ");
    }else printf("逻辑序号为%d,在链表中对应的数据为:%d ",a,p->data);
    }

    void number(LinkList &L){ //根据数据找到逻辑序号
    Linknode *p=L->link; //p指向第一个节点
    int a,j=1;
    printf("请输入要查找的元素:");
    scanf("%d",&a);
    printf(" ");
    while(p!=NULL&&p->data!=a){
    p=p->link;
    j++;
    }
    if(p==NULL){
    printf("要查找的元素不在这个链表中! ");
    } printf("要查找的元素%d的逻辑序号为:%d ",a,j);
    }

     LinkList locate(LinkList &L,int i){                                   //根据逻辑序号查找对应的位置 
    	int a,j=1;
    	Linknode *p=L->link;
    	while(p!=NULL&&j<i){
    		p=p->link;
    		j++;
    	}
    	return p;
    }
    
      void insert(LinkList L){                                          //插入数据 
      	LinkList p;
      	int a,b;
      	printf("请输入要插入的元素:");
      	scanf("%d",&a);
      	printf("
    ");
      	printf("请输入要插入的逻辑序号:"); 
      	scanf("%d",&b);
      	p=locate(L,b-1);                                                      //调用locate()函数 ,找到要插入的前一个位置 
      	if(p==NULL)  {
    	  printf("插入位置不当!");
    	  return;} 
    	Linknode *s=(Linknode*)malloc(sizeof(Linknode));                         //创建新的节点 
    	if(s==NULL){
    		printf("存储分配失败!
    ");
    		exit(1);                                                                                           //返回 
    	} s->data=a;                                                                                         // s的数据域为a 
    	s->link=p->link;                                                                                         //先连 
    	p->link=s;                                                                                                   //再断 
    	return;
    

    }

       void  printfdata(LinkList L ){                                                         //输出单链表          
       	if(L==NULL)  return;
        printf("%d	",L->data);                                                                   //表示第一个节点的数据 
        printfdata(L->link);
    	   }
       
       
    void  remove(LinkList  &L){                                                       //删除数据 
    	int a;  
    	Linknode *p;
    	printf("请输入要删除元素的逻辑序号:");
    	scanf("%d",&a); 
    	p=locate(L,a-1);                                                       //找到删除数据的前一个位置 
    	if(p==NULL||p->link==NULL){
    		printf("删除元素的逻辑序号不符合条件!
    "); 
    		return; 
    	}
    	Linknode *q;
    	q=p->link;
    	p->link=q->link;
    	free(q);                                                                                  //销毁q 
    } 
    

    int main(){
    Linknode L,p;
    int ending;
    L=(Linknode*)malloc(sizeof(Linknode)); //创建头节点
    if(!L){ //如果L为空,则执行。
    printf("存储分配错误! ");
    exit(1); //表示退出函数
    }
    printf("请输入约定的输入序列结束标志:");
    scanf("%d",&ending);
    p=L; //p指向头节点
    construct(p->link,ending); //调用创建、初始化函数construct();
    length(L); //调用长度函数length();
    locatedata(L);
    number(L);
    printf("输出所以元素:");
    printfdata(L->link); //将L->link=L;
    printf(" ");
    insert(L);
    printf("输出所以元素:");
    printfdata(L->link);
    printf(" ");
    remove(L);
    printf("输出所以元素:");
    printfdata(L->link);
    return 0;
    }

  • 相关阅读:
    jquery扩展鼠标mousewheel事件
    addEventListener和attachEvent介绍, 原生js和jquery的兼容性写法
    HTML,CSS,font-family:中文字体的英文名称
    最好的Java和Android开发IDE---IntelliJ IDEA使用技巧
    《Thinking in Java》习题——吸血鬼数字
    Java学习之——JavaBeans
    Android 开源库——侧滑菜单栏(SlidingMenu)的导入和使用
    Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)
    Android 布局学习之——Layout(布局)详解一
    Android 布局学习之——LinearLayout的layout_weight属性
  • 原文地址:https://www.cnblogs.com/lusilin/p/10674434.html
Copyright © 2011-2022 走看看