zoukankan      html  css  js  c++  java
  • 线性表的链式表示和实现

    一、线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中的任意元素,时间复杂度为1。然而,在做插入和删除操作时,需大量移动元素。

      链式存储结构,它不要求逻辑上相邻的元素在物理位置上也相邻,插入和删除操作时,只需修改结点的下一个元素指针,但查找元素时效率不如顺序存储。

    1.链式存储的结点

    #define OK 1
    #define ERROR 0
    typedef bool Status;
    typedef int elemType;
    typedef struct LNode{
    	struct LNode *next;  //指向下一个元素的指针
    	elemType data;        //结点的值
    }LNode,*LinkList;
    

    2.创建单链表

    a.头插法:每次将新的结点插入到第一个,所以链表的结点位置与输入的位置相反。

    b.尾插法:每次将新的结点插入到最后一个,所以链表的结点位置与输入的位置相同。

    //头插 建立链表L 长度为n 
    Status createList(LinkList &L,int n){
    	L = (LinkList)malloc(sizeof(LNode));
    	L->next=NULL;
    	for(int i=n;i>0;i--){
    		LNode *node = (LNode*)malloc(sizeof(LNode));
    		if(!node)
    			return ERROR;//分配内存失败 
    		printf("输入第%d个节点的值: ",i);
    		scanf("%d",&node->data);
    		node->next=L->next;
    		L->next=node;
    	}
    	return OK;
    }
    
    //尾插 
    Status createList2(LinkList &L,int n){
    	L = (LinkList)malloc(sizeof(LNode));
    	L->next=NULL;
    	LNode *last = L;	//最后一个节点 
    	for(int i=0;i<n;i++){
    		LNode *node = (LNode*)malloc(sizeof(LNode));
    		if(!node)
    			return ERROR;
    		printf("输入第%d个节点: ",i+1);
    		scanf("%d",&node->data);
    		node->next=NULL;
    		last->next=node;
    		last = node;
    	}
    	return OK;	
    }
    

    3.查找

    //得到单链表中的第i个元素e
    Status getElem(LinkList &L,int i,elemType &e){
    	LNode *t = L;
    	for(int j=0;j<i;j++){
    		if(t==NULL)	return ERROR;
    		t=t->next;
    	}
    	e = t->data;
    	return OK;
    } 
    

    4.插入

    //在单链表中插入元素e到位置i
    Status insert(LinkList &L,int index,int e){
    	LNode *t = L;	//指向要插入位置的前一个结点 
    	for(int i=0;i<index-1;i++){
    		if(!t)return ERROR;
    		t=t->next;
    	}
    	LNode *node = (LNode*)malloc(sizeof(LNode));
    	if(!node)return ERROR;
    	node->data=e;
    	node->next=t->next;
    	t->next=node;
    	return OK;
    }
    

    5.删除

    //删除链表中的第index个节点 返回删除的结点 
    LNode* del(LinkList &L,int index){
    	LNode *t=L;	//指向要删除结点的前一个 
    	for(int i=0;i<index-1;i++){
    		if(!t)return NULL;
    		t=t->next;
    	}
    	LNode *e = t->next;
    	t->next=t->next->next;
    	return e;
    }
    

    6.打印单链表

    //打印链表 
    void print(LinkList &L){
    	LNode *t = L->next;
    	while(t){
    		printf("%d  ",t->data);
    		t=t->next;
    	}
    	printf("
    ");
    }
    

      

  • 相关阅读:
    ionic4 无限滚动加载组件 ion-infinite-scroll-content 的loadingSpinner 属性
    ionic cordova build android 报错 解决
    ionic4 标题栏 ion-toolbar 默认 底部会显示一个底边框 解决
    ionic3 在ios12.2 12.3 12.4上页面无法滚动
    Android 打生产包(release)生成密钥(证书)及签名
    在Vue.js应用程序中使用Ionic 4组件
    ionic4 ionic-native列表
    清除 多行li 行间距
    Connection Pool
    Logging
  • 原文地址:https://www.cnblogs.com/hekuiFlye/p/9174602.html
Copyright © 2011-2022 走看看