数据结构-arithmetic线性表

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再遍历一圈与之比较

猜你喜欢

转载自blog.csdn.net/bertZuo/article/details/81462921