zoukankan      html  css  js  c++  java
  • 学习笔记1

    链表

    线性表链式存储结构(链表):

    1、链表结点由数据域和指针域构成。

    2、头结点:在开始结点之前的结点。其值域不包含任何信息。

    3、首元素结点:第一个元素所在的结点。

    4、头指针:一直指向链表中第一个结点的位置(如果表中不含头节点则头指针指向开始结点)。

    5、单链表
    带头结点的单链表:头指针head指向头结点。头指针head始终不等于NULL,head->next等于NULL的时候该链表为空。
    不带头结点的单链表:头节点head指向开始结点,当head等于NULL时该链表为空。

    6、头结点和头指针的区别:头指针是一个指针,头指针指向链表的第一个结点(如果链表有头结点,头指针指向头结点;否则,
    头指针指向开始结点);头结点是一个实际存在的点,它包含有数据域和指针域。头指针指向目标地址声明而没有分配存储空间,
    而头结点分配了一个结点的实际物理内存。

    单链表的结构定义:

    typedef struct Node // 结点类型定义
     { //ElemType 具体数据的类型据实际设定, 整型或者字符型等等
    	ElemType data; 
    	struct Node * next;
     }Node, *LinkList;
    

    初始化链表

    InitList(LinkList *L) 
    {
    	*L = (LinkList)malloc(sizeof(Node));
    	 (*L)->next=NULL; 
    }
    

    单链表头插法代码示例:

    void CreateFromTail(LinkList L)
    { 
    	Node *r, *s; int flag=1;//标记初值为1,当输入“$”时,标记flag为0,建表结束输入 
    	r=L; while(flag) 
    	{ 
    	c=getchar();//接收一字符
    		if(c!=’$’) //如果字符不是’$’,则执行头插
    		{
    				s=(Node *)malloc(sizeof(Node)); 
    			s->datac;
    			s->next=L->next;
    			L->next=s;
    		}
    		else
                    {                
    			flag=0; r->next=NULL;
                    }
    	}
    }
    

    单链表尾插法代码示例:

    void CreateFromTail(LinkList L)
    { 
        Node *r, *s; int flag=1;//标志--初值为1,当输入“$”时,flag为0,建表结束
         r=L; 
        while(flag)
        {
         c=getchar();//接收一字符 
            if(c!=’$’) //如果字符不是’$’,则执行尾插 
               {
                    s=(Node *)malloc(sizeof(Node)); 
                    s->data=c; 
                    r->next=s; 
                    r=s;
                }
            else 
                {
                    flag=0; r->next=NULL;
                }
        }
    }
    

    在表中任意位置插入一个节点:

    void InsList(LinkList L,int i,ElemType n)
    { 
    /*在带头结点的单链表L中第i个结点之前插入一个值为n的新结点。 */
    Node *pre,*s;
    int k; 
    if(i<1) return Error;
    pre=L; 
    k=0;
        while(pre!=NULL&&k<i-1)
        { 
            pre=pre->next;
            k=k+1; 
        } 
        if(!pre) 
        {
            printf(“插入位置不合理!”); 
            return Error; 
        } 
        s=(Node*)malloc(sizeof(Node)); //为n申请一个新的结点
        s->data=e; /*将待插入结点的值n赋给s的数据域*/ 
        s->next=pre->next;
        pre->next=s; 
        return OK;
    }
    

    删除单链表中的一个节点:

    void DelList(LinkList L,int i,ElemType *e) 
    { 
    Node *pre,*r;
    int k; 
    pre=L; 
    k =0; 
        while(pre->next!=NULL&&k<i-1) 
        { 
            pre=pre->next;
            k=k+1; 
        } 
        if( !(pre->next) ) 
        { 
            printf(“删除结点的位置i不合理!”);
            return ERROR; 
        } 
        r=pre->next;
        pre->next=pre->next->next /*删除结点r*/ 
        e = r->data; 
        free(r); 
        return OK; 
    }
    

    以上是本次对单链表的基本知识以及增删改查操作的部分学习记录

  • 相关阅读:
    [转载]分治算法详解
    数值的三种表示--C语言
    [转载]位运算操作
    递归--基于位运算的八皇后问题求解
    递归--基于回溯和递归的八皇后问题解法
    关于C/C++中数组元素的初始化
    递归的使用方法及说明
    递归--基于排列的八皇后问题解法
    Android笔记(二十) Activity中的跳转和值传递
    Android笔记(十九) Android中的Fragment
  • 原文地址:https://www.cnblogs.com/bwzh/p/12802243.html
Copyright © 2011-2022 走看看