DataStructure_第二章 线性表 ( 所有链表的分析及其实现 )

在这里插入图片描述

0x0000 线性表的概念及抽象数据类型定义

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述













0x0001 线性表的顺序存储

在这里插入图片描述

在这里插入图片描述













0x0010 线性表的链式存储

1. 单链表

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

亲自调试了一遍, 问题已经修改, 如果还有bug欢迎路过的大佬指正!

/*** 
 * @Author      : acmaker
 * @Date        : 2020-03-10 11:33:03
 * @LastEditTime: 2020-03-11 21:23:15
 * @FilePath    : \myCPlusPlusCode\DataStructure\LinearList\SingalLinkedList.cpp
 * @Website     : http://csdn.acmaker.vip
 * @Description : 
 */



#include <bits/stdc++.h> 
using namespace std; 
#define rg register 
#define sc scanf 
#define pf printf 
typedef long long ll; 

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0

// 线性表的链式存储结构
typedef char ElemType;
typedef struct Node {
    ElemType data;
    Node* next;
}Node, *LinkedList;
LinkedList L;

long long ListLength ( LinkedList L );
void InitList ( LinkedList *L );
void CreateFromHead ( LinkedList L );
void CreateFromTail ( LinkedList L );
Node* Get ( LinkedList L, long long pos );
Node* Locate ( LinkedList L, ElemType key );
int InsList ( LinkedList L, int pos, ElemType e );
int DelList ( LinkedList L, int pos, ElemType *e );
void DestroyList ( LinkedList L );


int main ( ) {  // freopen( "F:\\in\\.txt" , "r" , stdin ); 

    InitList( &L );

    // CreateFromHead( L );

    CreateFromTail( L );

    cout << Get( L, 3 )->data << endl;

    cout << Get( L, 2 )->data << endl;

    cout <<  Locate( L, '3' ) << endl;

    cout << InsList( L, 1, '8' ) << endl;

    ElemType backup;
    cout << DelList( L, 1, &backup ) << endl;

    DestroyList( L );
    

    return 0 ; 
} 

// 代码实现.

/***
 * @description: 计算带头结点的单链表 长度
 * @param :
 * @return:
 */
long long ListLength ( LinkedList L ) {
    Node *p = L->next;
    long long i;
    for ( i = 0; p!=NULL; ++i ) {
        p = p->next;
    }
    return i;
}

/*** 
 * @description: 初始化头结点, 注意传递的参数是头指针!
 * @param : 
 * @return: 
 */
void InitList ( LinkedList *t ) { 
    *t = (LinkedList)malloc( sizeof(Node) );
    (*t)->next = NULL;
}

/*** 
 * @description: 头插法建表
 * @param : 
 * @return: 
 */
void CreateFromHead ( LinkedList L ) {
    Node *s;
    bool state = true; // false为输入结束
    ElemType input;
    while ( state ) {
        cin >> input;
        if ( input=='$' ) state = false;
        else {
            s = (Node*)malloc( sizeof(Node) );
            s->data = input;
            s->next = L->next;
            L->next = s;
        }
    }
}

/*** 
 * @description: 尾插法建表
 * @param : 
 * @return: 
 */
void CreateFromTail ( LinkedList L ) {
    Node *s, *r = L;
    bool state = true;
    ElemType input;
    while ( state ) {
        cin >> input;
        if ( input=='$' ) state = false, r->next = NULL;
        else {
            s = (Node*)malloc( sizeof(Node) );
            s->data = input;
            r->next = s;
            r = s;
        }
    }
}

/*** 
 * @description: 带头结点单链表查找第 i 个结点
 * @param : 
 * @return: 
 */
Node* Get ( LinkedList L, long long pos ) {
    Node* p = L;
    long long i = 0;
    for ( ; (p->next!=NULL)&&(i<pos); ++i ) {
        p = p->next;
    }
    return (i==pos ? p : NULL);
}

/*** 
 * @description: 带头结点的单链表 查找值为key的结点
 * @param : 
 * @return: 返回查找到的值的地址...貌似没啥用...
 */
Node* Locate ( LinkedList L, ElemType key ) {
    Node* p = L->next;
    for ( ; p!=NULL; p=p->next ) {
        if ( p->data==key ) break;
    }
    return p;
}

/*** 
 * @description: 带头结点的单链表 插入
 * @param : 
 * @return: 
 */
int InsList ( LinkedList L, int pos, ElemType e ) {
    if ( pos<=0 ) return ERROR;
    Node *pre = L;
    ll i = 0;
    for ( ; (pre!=NULL)&&(i<pos-1); ++i ) {
        pre = pre->next;
    }
    if ( pre==NULL ) {
        cout << "超出链表最大长度!" << endl;
        return ERROR;
    }
    Node *s = (Node*)malloc( sizeof(Node) );
    s->data = e;
    s->next = pre->next;
    pre->next = s;
    return OK;
}

/*** 
 * @description: 带头结点的单链表 删除一个元素
 * @param : 注意, ElemType参数需要传递引用!
 * @return: 
 */
int DelList ( LinkedList L, int pos, ElemType *e ) {
    Node *pre = L;
    long long i = 0; // 注意, 从头结点开始
    for ( ; (pre->next!=NULL)&&(i<pos-1); ++i ) {
        pre = pre->next;
    }
    if ( pre->next==NULL ) {
        cout << "超出链表最大长度!" << endl;
        return ERROR;
    }
    Node *t = pre->next;
    pre->next = t->next;
    *e = t->data;
    free(t);
    return OK;
}

/*** 
 * @description: 
 * @param : 
 * @return: 
 */
void DestroyList ( LinkedList L ) { 
    Node *p = L, *t;
    while ( p->next!=NULL ) { 
        t = p->next;
        free(p);
        p = t;
    }
}

计算相关

在长度为N的顺序表仲,插入一个新元素平均需要移动表中_______个元素?删除一个元素平均需要移动_______个
在长度为N的顺序表仲,插入一个新元素平均需要移动表中________个元素,删除一个元素平均需要移动_______个元素,

- 在表头操作需要移动几个 在表尾操作需要移动几个 一共需要移动几个 平均需要移动几个
插入 n 0 n/2 n/2 / (n+1)
删除 n-1 0 (n-1)/2 (n-1)/2 / n
发布了160 篇原创文章 · 获赞 146 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44510468/article/details/104767718