学习总结1/10

今天接着学习了链表的循环链表和双链表,发现链表要处理的小细节真的太多了。

另外跟着学长学了dfs和bfs、快排。

总的来说(上午双链表,循环链表;下午dfs,bfs,快排)

晚上就写了一个双链表操作的题。链表真是让我摸不着头脑

1514: 合并链表(线性表)

时间限制:1s

内存限制:128MB

题目描述

(线性表)假设有两个按元素值递增次序排列的线性表,均以单链表形式存储。请编写算法将这两个单链表归并为一个按元素值递减次序排列的单链表,并要求利用原来两个单链表的结点存放归并后的单链表。

输入格式

输入长度n:5

输入数据:1 2 5 6 8

输入长度m:5

输入数据:3 4 7 9 10

输出格式

10 9 8 7 6 5 4 3 2 1

样例输入content_copy

4
7 9 10 11
4
8 12 13 14

样例输出content_copy

14 13 12 11 10 9 8 7 

 思路:就是按题目的要求做就行了

#include<stdio.h>
typedef struct DOUBLE_LIST
{
    int data;
    struct DOUBLE_LIST *front;
    struct DOUBLE_LIST *next;
}double_list;
double_list *createlist()       //创建有n个元素的双向链表 并输入元素
{
    double_list *head, *p, *q;
    int n,x;
    head = (double_list *)malloc(sizeof(double_list));
    head->front = head;
    head->next = head;
    p = head;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d", &x);
        q = (double_list *)malloc(sizeof(double_list));
        q->data = x;
        p->next = q;
        head->front = q;
        q->front = p;
        q->next = head;
        p = q;
    }
    return head;
}
//遍历并且输出这些元素
void printlist(double_list *head)
{
    double_list *p,*q;
    p = head;
    p = p->next;
    int k;
    scanf("%d",&k);
    k--;
    while(k--)
    p=p->next;
    q=p->front;
    while(p!=q)
    {
        if(p==head)
        {
            p=p->next;
            continue;
        }
        printf("%d ",p->data);
        p=p->next;
    }
    printf("%d \n",p->data);
}
//在第i个元素之前插入数据data
void insertlist_f(double_list *head, int i, int data)
{
    double_list *p = head, *q;
    p = p->next;
    i--;
    while(i--)
        p = p->next;
    q = (double_list *)malloc(sizeof(double_list));
    q->data = data;
    (p->front)->next = q;
    q->front = p->front;
    q->next = p;
    p->front = q;
}
//删除第i个位置的元素
void del(double_list *head, int i)
{
    double_list *p = head;
    p = p->next;
    i--;
    while(i--)
        p = p->next;
    (p->front)->next = p->next;
    (p->next)->front = p->front;
    free(p);
}
int main()
{
    double_list *head;
    head = createlist();
    int m;
    scanf("%d",&m);
    if(m>0)
    del(head,m);
    int n,k;
    scanf("%d%d",&n,&k);
    insertlist_f(head,n,k);
    printlist(head);
    return 0;
}

 明天把欠着的题补上然后尽量写几个搜索吧

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值