2017年学习的数据结构作的笔记,一些算法思想(伪代码实现)在日常学习中仍显得很重要,很多很多,在此记录整理不断补充,反复看反复理解反复记忆,加油!
1、寻找第1个比x大的元素的位置
int findElem(Seqlist L,int x) //顺序表Sequence list
{
int i;
for(i=0;i<L.length;++i)//遍历顺序表
{
if(x<L.data[i])//判断x和当前所扫描的元素大小
return i;
}
return i;//如果顺序表中不存在比x大的元素,则应该将x插入表尾元素之后,返回i来标记这种情况
}
2、在顺序表的某一位置上插入元素
void insertElem(Seqlist &L,int x)//L本身会发生改变,所以用引用型
{
int p,i;
p=findElem(L,x);//调用findElem函数找到插入位置p
for(i=L.length-1;i>=p;--i) //从末尾开始遍历顺序表
L.data[i+1]=L.data[i]; //从右往左逐个将元素右移
L.data[p]=x;//元素x放在位置p上
++(L.length);//表内增加个元素x,表长加1
}
3、查找第1个值等于e的元素
int findElem(Seqlist L,int e)
{
for(int i=0;i<L.length;++i)
if(e==L.data[i])
return i;
else
return -1;
}
4、在第p个位置插入元素e
int insertElem(Seqlist &L,int p,int e)
{
int i;
//判断插入位置是否合法
if(P<0||P>L.length||L.length==Maxsize)
return 0;
for(i=L.length-1;i>=p;--i)//从后往前遍历
L.data[i+1]=L.data[i];
L.data[p]=e;元素e查到位置p
++(L.length);
return 1;
}
5、删除表中下表为p的元素
int deleteElem(Seqlist &L,int p,int &e)
{
int i;
if(p<0||P>L.length-1)
return 0;
e=L.data[p];
for(i=p;i<L.length;++i)//从位置p开始将后面元素逐个前移
L.data[i]=L.data[i+1];
--(L.length);
return 1;
}
6、连接两个带头结点的单链表
void connetList(Linklist &ha,Linklist &hb,Linklist &hc,Linklist &hd,int m,int n,)
//hc是要新生成链表的头结点,hd是即将销毁的链表的头结点
{
//比较两单链表,短的放前面长的在后面,可提高效率
if(m<n)
{
hc=ha;
hd=hb;
}
else
{
hc=hb;
hd=ha;
}
p=hc;//p指针指向了新链表头结点
while(p->next!=Null)
{
p=p->next;//p指针往后遍历
//p指向前一个链表的最后一个结点,连接了后一个链表的第一个结点(除去头结点)
p->next=hd->next;
free(hd);
ha=hb=Null;
length=m+n;
}
}
7、查找1个值为x的结点,存在就删除并返回1
int findAndDelete(LNode *c,int x)
{
LNode *p,*q;
p=c;//p指针指向头结点
while(p->next!=Null)
{
if(p->next->data==x)
break;//如果找到值为x的结点,则循环结束跳出
p=p->next;//如果找不到就一直往下找
}
if(p->next==Null)
return 0;
else
{
q=p->next;
p->next=p->next->next;
free(q);
return 1;
}
}
8、尾插法建立双链表
void createDlistR(DLNode *&L,int a[],int n)
//将数组a中元素建立1个链表
{
DLNode *s,*r;//s指向新申请的结点,r始终指向终端结点
int i;
L=(DLNode*)malloc(sizeof(DLNode));//申请头结点空间
L->prior=Null;
L->next=Null;
r=L;//只有一个结点时候,头结点也是终端结点
for(i=0;i<n;++i)
{
s=(DLNode*)malloc(sizeof(DLNode));//申请新结点空间
s->data=a[i];
r->next=s;
s->prior=r;
r=s;
}
r->next=Null;//r指向的结点为终端结点
}
9、双链表中查找第1个值为x的值
DLNode * findNode(DLNode *C,int x)
{
DLNode *p=c->next;
while(p!=Null)
{
if(o->data==x)
break;
p=p->next;
}
return p;
}
10、数组表示线性表,将n个元素的R表插到有m个元素的L表,并使之有序
void insertElem(int A[],int m,int n)
{
int i,j;
int temp;
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];
A[j+1]=temp;
}
}//每个R段中元素逐个与L段中的元素从后往前比较,若R段中放在temp里的元素小于L段中元素,则后移腾出位置插入
11、单链表A,B构成的集合,删除A中A,B公共的元素
void difference(LNode *A,LNode *B)
{
LNode *p=A->next;
*q=B->next;
LNode *pre=A;
LNode *r;
while(p!=Null&&q!=Null)
{
if(p->data<q->data)
{
pre=p;
p=p->next;
}
else if(p->data>q->data)
{
q=q->next;
}
else //p=q时,删除相同结点
{
pre->next=p->next;
r=p;
p=p->next;
free(r);
}
}
}
12、删除(purge)单链表中值相同的多余元素
void purge(LinkList L)
{
if(L->next!=Null)
{
p=L->next; //L为头结点指针,p从头结点的下一个结点开始
while(p->next!=Null)
{
//判断值是否相同
if(p->next->data==p->data)
{
q=p->next;
p->next=q->next;
free(q);
}
else
p=p->next;
}
}
}
13、单链表就地逆置(reverse)
void reverse(LinkList L)
{
if(L->next!=Null)
{
p=L->next;
L->next=Null; //拿下头结点
do
{
q=p->next;
p->next=L->next;
L->next=p;
p=q;
}while(p!=Null);
}
}
14、单向循环链表改为双向循环链表
void change(DuLink L)
{
if(L->next==L)
L->prior=L;//双向循环链表判空
else
{
do
{
p->next->prior=p;
p=p->next;
}while(p!=L)
}
}
15、取线性表中间位序元素(用单链表实现线性表)
ElemType getMidElem(LinkList L)
{
p=q=L;
do
{//p指针比q指针多执行一次,相当于p的速度是q的两倍,p执行完毕,正好q指向中间位序元素
p=p->next;
if(p->next!=Null)
p=p->next;
q=q->next;
}while(p->next!=NUll)
return q->data;
}
16、判断单链表中元素两两不等
status unequal(LinkList L)
{
p=L->next;
while(p!=Null)
{
q=p->next;
while(q!=Null)
{
if(q->data==p->data)
return FALSE;
q=q->next;
}
p=p->next;
}
return TRUE;
}//p不动,q遍历一遍与之比较;p动一下,q再遍历一圈与之比较