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 |