c语言采用头插法或尾插法建立链表,从键盘输入递增有序的数据建立链表
编写算法实现有序链表LIST1和LIST2合并为一个LIST3,要求LIST3仍然是递增有序的链表,并对LIST3链表删除值相同的结点,即若链表中有多个结点具有相同的数据...
编写算法实现有序链表 LIST1 和 LIST2 合并为一个 LIST3,要求
LIST3 仍然是递增有序的链表,并对 LIST3 链表删除值相同的结点,即
若链表中有多个结点具有相同的数据域值,只保留其中一个结点,其
余的均从链表中删去,使得最后得到的链表中的所有节点的数据域都
不相同,具有以下功能菜单:
(1) 建立链表的算法;
(2) 合并有序链表的算法;
(3) 删除相同结点的算法;
(4) 输出链表;
求完整代码 展开
LIST3 仍然是递增有序的链表,并对 LIST3 链表删除值相同的结点,即
若链表中有多个结点具有相同的数据域值,只保留其中一个结点,其
余的均从链表中删去,使得最后得到的链表中的所有节点的数据域都
不相同,具有以下功能菜单:
(1) 建立链表的算法;
(2) 合并有序链表的算法;
(3) 删除相同结点的算法;
(4) 输出链表;
求完整代码 展开
3个回答
展开全部
#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);
}
//这可是血汗钱啊.....
来自:求助得到的回答
展开全部
1,首先到当地购买USB键盘
2,使用键盘的插口连接笔记本的USB接口(记得是USB接口)
3,键盘插上以后会自动安装好驱动,耐心等待几分钟驱动安装好以后,就可以使用了
4、驱动安装好了以后建议把电脑重启
2,使用键盘的插口连接笔记本的USB接口(记得是USB接口)
3,键盘插上以后会自动安装好驱动,耐心等待几分钟驱动安装好以后,就可以使用了
4、驱动安装好了以后建议把电脑重启
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我还想有的版本
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询