线性表专题

题目:设计算法分段逆置线性表。例如线性表(1,2,3,4,5,6,7,8),按k等于3分段逆置得到
(3,2,1,6,5,4,8,7)

代码展示:(此题注意死循环,故使用r保存p的位置,防止断链或死循环)

void Reverse(LinkList &L,int k)
{
    LinkList s = L;
    LinkList p,q;
    p = s->next;
    while(p)
    {
        int i = k;
        LinkList r = p;
        s->next = NULL;
        while(i!=0 && p!=NULL)
        {
            q = p->next;
            p->next = s->next;
            s->next = p;
            p = q;
            i--;
        }
        s = r;
    }
}

题目:设list是带头结点有n个值为整数的单链表表头指针,设计算法,将单链表值大于x的结点都放在所有值小于x结点后面

代码展示:(此题注意p要申请空间,否则只是一个单纯的地址,没有next域,另外防止断链)

void Put(LinkList &L,int x)
{
    LinkList s = L;
    LinkList p,q;
    p = (LinkList)malloc(sizeof(LinkNode));
    p->next = NULL;
    while(s->next!=NULL)
    {
        q = s->next;
        if(q->data<x)
        {
            s = q;
        }
        else
        {
            s->next = q->next;
            q->next = p->next;
            p->next = q;
        }
    }
    s->next = p->next;
}

题目:设有带头单链表list,每个结点的结构为(data,link,sort),link和sort为指针域,现在链表已经按link域连接起来,设计算法,利用sort域,将所有结点排序。

代码展示:

void sort(LinkList &L)
{
    LinkList p,q,s;
    p = L->next;
    LinkList arr[100];
    int i = 0;
    while(p)
    {
        arr[i] = p;
        p = p->next;
        i++;
    }
    for(int m=0; m<i; m++)
    {
        for(int n=m+1; n<i; n++)
        {
            if(arr[m]->data > arr[n]->data)
            {
                LinkList temp = arr[m];
                arr[m] = arr[n];
                arr[n] = temp;
            }
        }
    }
    LinkList k = L->next;
    i = 0;
    while(k)
    {
        k->sort = arr[i++];
        k = k->next;
    }
}

题目:设有两个单链表,判断其中一个是否是另一个的子序列

代码展示:

int jude(LinkList A,LinkList B)//判断B是不是A的子序列
{
    LinkList p,m,n;
    p=A->next;
    while(p)
    {
        m = p;
        n = B->next;
        while(m->data==n->data)
        {
            printf(" m=%d \n",m->data);
            m = m->next;
            n = n->next;
            if(!n) return 1;
            if(!m) return 0;
        }
        p = p->next;
    }
    return 0;
}

题目:设list是一个有n个结点带头结点单链表,A[m] (m<n)是一个整数有序数组,值在1到n之间,设计算法,从list中删除序号包含在A[m]中的结点。

代码展示:

void DeleteAllElems(LinkList &L,int *arr)
{
    LinkList p = L;
    int i = 0;
    while(i<= sizeof(arr)/ sizeof(int))
    {
        while(p->next!=NULL)
        {
            if(p->next->data==arr[i])
            {
                LinkList k = p->next;
                p->next = p->next->next;
                free(k);
            }
            else
            {
                p = p->next;
            }
        }
        i++;
        p = L;
    }
}

题目:编写程序,要求完成:
1.建立一个带头结点的线性表,用以存放输入的二进制数,链表中每个结点的data域存放一个二进制位。
2.在此链表下实现对二进制数加1的运算。

代码展示:
(1)

void Create(LinkList &L)
{
    LinkList p = L;
    int x;
    while(1)
    {
        scanf("%d",&x);
        if(x==-1)
        {
            break;
        }
        LinkList q = (LinkList)malloc(sizeof(LinkNode));
        q->data = x;
        q->next = p->next;
        p->next = q;
    }
}

(2)

void Add(LinkList &L)
{
    //模拟二进制加1操作
    LinkList p = L->next;
    while(p)
    {
        if(p->data==0)
        {
            p->data++;
            break;
        }
        else
        {
            p->data = 0;
            if(p->next==NULL)
            {
                LinkList s = (LinkList)malloc(sizeof(LinkNode));
                s->data = 1;
                s->next = p->next;
                p->next = s;
                break;
            }
            p = p->next;
        }
    }
    //逆置链表得到正确的值
    LinkList p2 = L;
    LinkList q = L->next;
    p2->next = NULL;
    while(q)
    {
        LinkList s = q->next;
        q->next = p2->next;
        p2->next = q;
        q = s;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值