zoukankan      html  css  js  c++  java
  • 线性表(链式存储结构)

    链式与顺序结构的最大区别在于,插入或删除操作需要移动大量元素。

    链表类型:单链表,循环链表,双向链表。

    单链表的组成:每个数据元素内包括两个域:数据域和指针域。

    单链表的创建方式有两种:一种是头插法和尾插法。

    循环链表:单链表最后一个节点的指针域不为空而是指向链表的头结点。

     双向链表与单链表的区别在于为了直接获取节点的前趋而加上一个指向前趋节点的指针域。

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef int ElemType;
    
    typedef struct Node{
        ElemType data;
        struct Node *next;
    }ListNode;
    
    typedef ListNode *LinkList; 
    
    /**
    ***插入 
    ***/ 
    void InsertList(LinkList head, int i, ElemType x)
    {
        ListNode *p, *s; 
        int j = 0;
        p = head;
        while(p != NULL && j < i - 1) {
            p = p->next; 
            ++j;
        }
        if (p == NULL) {
            printf("ERROR
    ");
            return ;
        } else {
            s = (ListNode *)malloc(sizeof(ListNode));
            s->data = x;
            s->next = p->next;
            p->next = s;
        }
    }
    /**
    *** 删除 
    **/
    ElemType DeleteList(LinkList head, int i)
    {
        ListNode *p, *s;
        ElemType x;
        int j = 0;
        p = head;
        while (p != NULL && j < i - 1) {
            p = p->next; ++j;
        }    
        if (p == NULL) {
            printf("position error
    ");
            return -1;
        } else {
            s = p->next;
            p->next = s->next;
            x = s->data;
            free(s);
            return x;
        }
    }
    
    /**
    **头插法 
    **/
    LinkList CreateListHead()
    {
        LinkList head = NULL;
        ListNode *p;
        int ch;
        while( (ch = getchar() )!= '
    ') {
            p = (ListNode *)malloc(sizeof(ListNode));
            p->data = ch;
            p->next = head;
            head = p;
        }
        return head;
    }
    /**
    ** 尾插法 
    **/
    LinkList CreateListTail() 
    {
        LinkList head = (ListNode *)malloc(sizeof(ListNode));
        ListNode *p, *r;
        int ch;
        r = head;
        while( (ch = getchar()) != '
    ') {
            p = (ListNode *)malloc(sizeof(ListNode));
            p->data = ch;
            r->next = p;
            r = p; 
        }
        r->next = NULL;
        return head;
    }
    
    ListNode *LocateNodek(LinkList head, ElemType k) 
    {
        ListNode *p = head->next;
        while(p && p->data != k) {
            p = p->next;
        }    
        return p;
    }
    
    ListNode *GetNodei(LinkList head, int i) 
    {
        ListNode *p; int j = 1;
        p = head->next;
        while( p!= NULL && j < i) {
            p = p->next; ++j;
        }
        if (j == i) 
            return p;
        else 
            return NULL;
    } 
  • 相关阅读:
    几种连接数据库的OLEDB驱动程序
    Javascript如何访问和处理系统文件
    如何自学Java 经典
    Android Studio 修改 包名
    Android Studio -导入项目 gradle处理
    Android Studio- 把项目提交到SVN中操作方法
    android studio 运行太慢了
    Java多线程 -sleep 用法详解
    Java -native 方法
    Java多线程 -yield用法
  • 原文地址:https://www.cnblogs.com/Python-233/p/14947863.html
Copyright © 2011-2022 走看看