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

    说明:严蔚敏的《数据结构》(C语言版)学习笔记,记录一下,以备后面查看。


    #include <stdio.h>
    #include <malloc.h>
    
    const int OK = 1;  //定义正确返回
    const int ERROR  = -1;  //定义错误的返回
    const int OVERFLOW = -2; //定义溢出
    
    //定义元素类型
    typedef int ElemType;
    //定义返回类型
    typedef int Status;
    
    typedef struct LNode{
    	ElemType data;
    	struct LNode *next;
    }LNode, *LinkList;
    
    //获取第i个元素(L为带头结点的单链表的头指针)
    Status GetElem_L(LinkList L, int i, ElemType &e){
    	LinkList p = L->next; //L->next指向头结点
    	int j = 1;
    	while(p&&j<i){
    		p = p->next;
    		++j;
    	}
    	if(!p || j>i) return ERROR;
    	e = p->data;
    	return OK;
    }
    
    //插入元素(第i个位置之前插入元素)
    Status ListInsert_L(LinkList L, int i, ElemType &e){
    	LinkList p = L; //头结点
    	int j = 0;
    	while(p && j<i-1){
    		p = p->next;
    		++j;
    	}
    	if(!p || j>i-1) return ERROR;
    	LinkList s = (LinkList)malloc(sizeof(LNode));
    	s->data = e;
    	s->next = p->next;
    	p->next = s;
    	return OK;
    }
    
    //删除第i个元素
    Status ListDelete_L(LinkList &L, int i, ElemType &e){
    	LinkList p = L; //p指针指向头结点
    	int j = 0; 
    	while(p && j<i-1){
    		p = p->next;
    		++j;
    	}
    	if(!p || j>i-1) return ERROR;
    	LinkList s = p->next;
    	p->next = s->next;
    	e = s->data;
    	free(s);
    	return OK;
    }
    
    
    //创建链表,并添加n个数据结点
    void CreateList_L(LinkList &L, int n){
    	L = (LinkList)malloc(sizeof(LNode));
    	L->next = NULL;  //创建一个带头结点的单链表
    	int i;
    	LinkList p;
    	for(i=n;i>0;--i){
    		p = (LinkList)malloc(sizeof(LNode));
    		printf("请输入链表第%d个元素的数据:
    ", i);
    		scanf("%d", &p->data);
    		p->next = L->next; //头插法
    		L->next = p;
    	}
    }
    
    //遍历链表
    void ShowList_L(const LinkList &L){
    	LinkList p = L->next;
    	int j = 1;
    	while(p){
    		printf("链表的第%d个元素是%d
    ", j, p->data);
    		p = p->next;
    		++j;
    	}
    }
    
    int main(){
    	LinkList L;
    	printf("============创建5个数据结点============
    ");
    	CreateList_L(L, 5);
    	ShowList_L(L);
    	printf("============删除了第5个元素============
    ");
    	ElemType e;
    	ListDelete_L(L, 5, e);
    	ShowList_L(L);
    	printf("============添加第5个元素=============
    ");
    	ListInsert_L(L, 5, e);
    	ShowList_L(L);
    
    	scanf("%d");
    	return 0;
    }
    部分说明:

    1、第i个元素之前插入元素

    如上图所示,假如现在有4个元素,那么有四个可选插入位置(①②③④):

    让p先指向头结点,我们需要找到第i-1个结点,也就是需要插入位置的前一个结点,比如我们要插入到i=3,那么需要找到2位置,插入到③位置。


  • 相关阅读:
    设计模式总结
    设计模式之工厂
    C#
    UML画图总结
    UML视频总结
    类图
    读取文件信息
    HMAC算法加密
    SHA_1计算消息摘要
    获取指定长度的随机字符串
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6468673.html
Copyright © 2011-2022 走看看