c语言采用头插法或尾插法建立链表,从键盘输入递增有序的数据建立链表

编写算法实现有序链表LIST1和LIST2合并为一个LIST3,要求LIST3仍然是递增有序的链表,并对LIST3链表删除值相同的结点,即若链表中有多个结点具有相同的数据... 编写算法实现有序链表 LIST1 和 LIST2 合并为一个 LIST3,要求
LIST3 仍然是递增有序的链表,并对 LIST3 链表删除值相同的结点,即
若链表中有多个结点具有相同的数据域值,只保留其中一个结点,其
余的均从链表中删去,使得最后得到的链表中的所有节点的数据域都
不相同,具有以下功能菜单:
(1) 建立链表的算法;
(2) 合并有序链表的算法;
(3) 删除相同结点的算法;
(4) 输出链表;
求完整代码
展开
 我来答
zamswi
推荐于2018-05-06 · TA获得超过212个赞
知道小有建树答主
回答量:224
采纳率:33%
帮助的人:156万
展开全部
#include <stdio.h>
#include <stdlib.h>
/*定义链表结点*/
typedef struct st_node {
    int value;
    struct st_node *next;
} node_t;
/*定义链表*/
typedef struct {
    node_t head;
    node_t *tail;
} list_t;
/*插入到队列尾部*/
void list_push_back(list_t *l, int value) {
    node_t *t = (node_t*)malloc(sizeof(node_t));
    t->value = value;
    t->next = NULL;

    l->tail->next = t;
    l->tail = t;
}
/*有序地插入元素*/
void list_push_sort(list_t *l, int value) {
    /*找出小于或等于 value 的节点,插入到该节点前面*/
    node_t *p = l->head.next, *last = &l->head, *t;
    for (; p; last = p, p = p->next) {
        if (value <= p->value) {
            t = (node_t*)malloc(sizeof(node_t));
            t->value = value;
            t->next = p;

            last->next = t;
            return;
        }
    }
    /*如果没有小于或等于 value 的节点,则直接插入到末尾*/
    list_push_back(l, value);
}
/*使用数组初始化有序链表*/
void list_init(list_t* l, int* p, int s) {
    int i = 0;
    l->head.next = NULL;
    l->tail = &l->head;
    for (; i < s; ++i) {
        list_push_sort(l, p[i]);
    }
}
/*清空链表*/
void list_clear(list_t *l) {
    node_t *p = l->head.next, *t;
    while (p) {
        t = p;
        p = p->next;
        free(t);
    }
    l->head.next = NULL;
    l->tail = &l->head;
}
/*合并有序链表*/
void list_merge(list_t *l, list_t *r, list_t *o) {
    node_t *pl = l->head.next, *pr = r->head.next;
    while (pl || pr) {
        if (pl && pr) {
            if (pl->value <= pr->value) {
                list_push_back(o, pl->value);
                pl = pl->next;
            } else {
                list_push_back(o, pr->value);
                pr = pr->next;
            }
        } else if (pl) {
            list_push_back(o, pl->value);
            pl = pl->next;
        } else {
            list_push_back(o, pr->value);
            pr = pr->next;
        }
    }
}
/*删除相同结点*/
void list_duplicate_delete(list_t *l) {
    if (&l->head != l->tail) {
        node_t *p = l->head.next, *last, *t;
        int value = p->value;

        last = p;
        p = p->next;
        while (p) {
            if (value == p->value) {
                t = p;
                last->next = p->next;
                p = p->next;
                free(t);
            } else {
                value = p->value;
                last = p;
                p = p->next;
            }
        }
    }
}
/*打印链表*/
void list_show(char* name, list_t *l) {
    node_t *p = l->head.next;
    printf("%s: ", name);
    for (; p; p = p->next) {
        printf("%d, ", p->value);
    }
    printf("\n");
}
/*主函数*/
void main() {
    list_t list1, list2, list3;
    int a[] = { 10, 4, 6, 12, 1, 8, 14, 10, 14, 6 };
    int b[] = { 7, 11, 6, 1, 13, 5, 1, 14 };

    /*所有链表需要初始化后才能使用*/
    list_init(&list1, a, sizeof(a) / sizeof(int));
    list_init(&list2, b, sizeof(b) / sizeof(int));
    list_init(&list3, NULL, 0);

    printf("初始值:\n");
    list_show("List1", &list1);
    list_show("List2", &list2);
    list_show("List3", &list3);

    /*合并链表*/
    list_merge(&list1, &list2, &list3);
    printf("合并后:\n");
    list_show("List1", &list1);
    list_show("List2", &list2);
    list_show("List3", &list3);

    /*去重复*/
    list_duplicate_delete(&list3);
    printf("去重复后:\n");
    list_show("List1", &list1);
    list_show("List2", &list2);
    list_show("List3", &list3);

    /*所有链表都需要释放空间*/
    list_clear(&list1);
    list_clear(&list2);
    list_clear(&list3);
}

//这可是血汗钱啊.....

来自:求助得到的回答
鸭肉前
2016-12-12 · TA获得超过4.6万个赞
知道小有建树答主
回答量:536
采纳率:100%
帮助的人:77.3万
展开全部
1,首先到当地购买USB键盘
2,使用键盘的插口连接笔记本的USB接口(记得是USB接口)
3,键盘插上以后会自动安装好驱动,耐心等待几分钟驱动安装好以后,就可以使用了
4、驱动安装好了以后建议把电脑重启
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
bai84797553
2016-12-12 · TA获得超过1764个赞
知道答主
回答量:160
采纳率:32%
帮助的人:47.4万
展开全部
我还想有的版本
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式