线性表(数据结构)
掌握知识:
- 结构体
- 指针
typedef struct Node{
int data;
struct Node* next;
}NODE,*PNODE;
表 | 顺序表 | 链表 |
---|---|---|
方式 | 随机存取 | 顺序存取 |
查找 | O(1) | O(n) |
删除 | 1 n + 1 \frac {1}{n+1} n+11 ∑ i = 0 n + 1 \sum_{i=0}^{n+1} ∑i=0n+1(n-i+1)= n 2 \frac {n}{2} 2n | O(1)(确定删除元素位置后) |
插入 | 1 n \frac {1}{n} n1 ∑ i = 0 n \sum_{i=0}^{n} ∑i=0n(n-i)= n − 1 2 \frac {n-1}{2} 2n−1 | O(1)(确定插入位置后) |
链式表示和实现(是否有头结点)
- 线性链表
/*
删除
PNODE temp=p->next;
p->next=temp->next;
free(temp);
*/
bool deleteList(PNODE s,int i,int* val){
int j=0;
PNODE p=s;
while(p->next&&j<i-1){
p=p->next;
j++;
}
PNODE temp=p->next;
*val=temp->data;
p->next=p->next->next;
free(temp);
return true;
}
/*
插入
s->next=p->next;
p->next=s;
*/
bool insertList(PNODE L,int i,int val){
PNODE p=L;
int j=0;
PNODE s=(PNODE)malloc(sizeof(PNODE));
s->data=val;
while(p->next&&j<i-1){
p=p->next;
j++;
}
s->next=p->next;
p->next=s;
return true;
}
- 循环链表
- 双向链表
示例:
- 将两个有序链表合并为一个
- 一元多项式的表示及相加