编写一个C语言程序,要求实现带头结点的链表的以下功能: 链表初始化、链表的建立(分别按头插法和尾插法两种方法建立两个链表:链表A和链表B,要求提供机会在键盘上分别依次输入两个链表的元素值)、链表A的按值查找(提供机会在键盘上输入要查找的值)、链表A的遍历、链表A的插入(提供机会在键盘上输入要插入的值和插入的位置)、链表A的删除(提供机会在键盘上输入要删除的值)、最后再把链表A和链表B进行合并,合并之后成链表C,要求链表C仍有序。
时间: 2023-05-24 15:07:32 浏览: 135
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct Node{
int data; // 数据域
struct Node* next; // 指针域
}Node, *LinkedList;
// 函数声明
void initList(LinkedList* L); // 链表初始化
void createListF(LinkedList* L); // 头插法建立链表
void createListR(LinkedList* L); // 尾插法建立链表
Node* findNode(LinkedList L, int x); // 按值查找节点
void traverseList(LinkedList L); // 遍历链表
void insertNode(LinkedList L, int x, int i); // 插入节点到指定位置
void deleteNode(LinkedList L, int x); // 删除节点
void mergeList(LinkedList* La, LinkedList* Lb, LinkedList* Lc); // 合并两个有序链表
int main(){
LinkedList La, Lb, Lc;
printf("初始化链表A...\n");
initList(&La);
printf("初始化链表B...\n");
initList(&Lb);
printf("请按头插法输入链表A的元素(以0作为结束标志):");
createListF(&La);
printf("请按尾插法输入链表B的元素(以0作为结束标志):");
createListR(&Lb);
printf("链表A的元素为:");
traverseList(La);
printf("链表B的元素为:");
traverseList(Lb);
int x;
printf("请输入要查找的值:");
scanf("%d", &x);
Node* p = findNode(La, x);
if(p)
printf("链表A中值为%d的节点在第%d个位置。\n", x, (int)(p - La));
else
printf("链表A中不存在值为%d的节点。\n", x);
int a;
printf("请输入要插入的值:");
scanf("%d", &a);
int i;
printf("请输入要插入的位置:");
scanf("%d", &i);
insertNode(La, a, i);
printf("插入后的链表A为:");
traverseList(La);
int b;
printf("请输入要删除的值:");
scanf("%d", &b);
deleteNode(La, b);
printf("删除后的链表A为:");
traverseList(La);
mergeList(&La, &Lb, &Lc);
printf("合并后的链表C为:");
traverseList(Lc);
return 0;
}
// 初始化链表
void initList(LinkedList* L){
// 创建头结点
*L = (LinkedList)malloc(sizeof(Node));
(*L)->next = NULL;
}
// 头插法建立链表
void createListF(LinkedList* L){
int x;
scanf("%d", &x);
while(x){
Node* p = (Node*)malloc(sizeof(Node));
p->data = x;
p->next = (*L)->next;
(*L)->next = p;
scanf("%d", &x);
}
}
// 尾插法建立链表
void createListR(LinkedList* L){
int x;
Node* tail = *L;
scanf("%d", &x);
while(x){
Node* p = (Node*)malloc(sizeof(Node));
p->data = x;
p->next = NULL;
tail->next = p;
tail = p;
scanf("%d", &x);
}
}
// 按值查找节点
Node* findNode(LinkedList L, int x){
Node* p = L->next;
while(p){
if(p->data == x)
return p;
p = p->next;
}
return NULL;
}
// 遍历链表
void traverseList(LinkedList L){
Node* p = L->next;
while(p){
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
// 插入节点到指定位置
void insertNode(LinkedList L, int x, int i){
Node* p = L;
int j = 0;
while(p && j < i - 1){
p = p->next;
j++;
}
if(!p || j > i - 1){
printf("插入位置错误!\n");
return;
}
Node* node = (Node*)malloc(sizeof(Node));
node->data = x;
node->next = p->next;
p->next = node;
}
// 删除节点
void deleteNode(LinkedList L, int x){
Node* p = L;
while(p->next){
if(p->next->data == x){
Node* node = p->next;
p->next = node->next;
free(node);
return;
}
p = p->next;
}
printf("未找到要删除的节点!\n");
}
// 合并两个有序链表
void mergeList(LinkedList* La, LinkedList* Lb, LinkedList* Lc){
Node* pa = (*La)->next;
Node* pb = (*Lb)->next;
Node* pc = (*Lc) = (*La); // 合并后的链表C共用链表A的头结点
while(pa && pb){
if(pa->data <= pb->data){
pc->next = pa;
pa = pa->next;
}
else{
pc->next = pb;
pb = pb->next;
}
pc = pc->next;
}
if(pa)
pc->next = pa;
if(pb)
pc->next = pb;
}
```
阅读全文