单链表
双链表
循环单链表
循环双链表
基于空间:
基于时间:
int A[maxSize];
int n;
//或者这样写
typedef struct Sqlist
{
int data[maxSize];
int length;
}Sqlist;
typedef struct LNode
{
int data;
struct LNode* next;
}LNode;
typedef struct DLNode
{
struct DLNode* prior;
int data;
struct DLNode* next;
}DLNode;
初始化顺序表时只需要将长度设置为0便可
void insertElem(int A[],int m,int n)
{
int temp;
int i,j;
for(i = m ; i < m+n ; i++)
{
temp = A[i];
for(j = i-1 ; j >= 0 && temp < A[j] ; j--)
A[j+1] = A[j];//此时j位置有个坑,指针在j位置
//此刻指针跳到j-1位置
//此刻,j元素<=temp,j+1元素> temp
A[j+1] = temp;
}
}
::时间复杂度为O(mn)::
::空间复杂度为O(1),算法所需的额外存储空间与数据规模无关!::
void difference (LNode* A,LNode* B)
{
LNode * p = A->next;
LNode * q = B->next;
LNode * prior = A;
while(p != NULL && q !=NULL)
{
if(p->data < q->data)
{
prior = p;
p = p->next;//只移动p及其前缀
}
else if(p->data > q->data)
{
q = q->next;//只移动q
}
else
{
pre->next = p->next;
free(p);
p = pre->next;
}
}
}
::时间复杂度为O(m+n)::
为什么在单循环链表中设置尾指针比设置头指针更好?
::因为可以用它来方便的查找链表的开始结点和终端结点,查找时间均为O(1)::
有一个顺序表L,全是整型数据,设计一个算法,将L中所有小于表头元素的整数放在前半部分,大于表头元素的帧数放在后半部分。
void move (Sqlist& L){
int temp;
int i = 0;
int j = L.length-1;
temp = L.data[i];
while(iL.data[j]>temp)
j--;
if(iL.data[i] = L.data[j];
i++;
}
while(iL.data[i]<=temp)//加一个等号,结果大不一样!
i++;
if(iL.data[j] = L.data[i];
j--;
}
}
L.data[i] = temp;
}
void deletelist(LNode* L){
LNode *p = L->next;
LNode *q = p->next;
LNode *r;
while(q != NULL){ //q从头到尾遍历一遍链表,找不同
while(q != NULL && q->data == p->data) q = q->next;
if(q != NULL){
p = p->next;
p->data = q->data;
}
}
q = p->next;
p->next = NULL; //将有用部分和重复部分斩断联系
while(q != NULL){ //删除重复的部分
r = q;
q = q->next;
free(r);
}
}
void deletemin(LNode *L){
LNode *pre = L, *p = L->next, *min = p, *minpre = pre;
while(p != NULL){
if(p->data < min->data){
min = p;
minpre = pre;
}
p = p->next;
pre = pre->next;
}
minpre->next = min->next;
free(min);
}
::遍历链表需要两指针,删除一结点需要两指针,一共需要4指针::
反之,如果要删除最大的结点呢?::也得要4个指针。::
void reverse(LNode *L){
//利用头插法,可以使链表逆序
LNode *p = L->next;
LNode *q;
L->next = NULL;
while(p != NULL){
q = p->next;
p->next = L->next;
L->next = p;
p = q;
}
}
void reprint(LNode *L){
if(L != NULL){
reprint(L->next);
cout<<L->data<<" ";
}
cout<<endl;
}
void kvalue(LNode *L, int k){
LNode *p = L->next;
LNode *q = L;
int i = 1;
while(p != NULL){
p = p->next;
i++;
if(i > k)
q = q->next;
}
if(q = L)
cout<<0;
else
cout<<q->data;
}