编写一个C语言程序,要求实现带头结点的链表的以下功能: 链表初始化、按头插法建立链表A(用键盘依次输入链表A的元素值,以回车键结尾),按尾插法建立链表B(用键盘依次输入链表B的元素值,以回车键结尾)、链表A的按值查找(在键盘上输入要查找链表A的值),并打印出要查找值的位置、链表A的遍历输出、链表A的插入(在键盘上输入要插入的值和插入的位置)、链表A的删除(在键盘上输入要删除的值)、最后再打印链表A和链表B把链表A和链表B进行合并,合并之后生成链表C,要求链表C仍有序。(要求每一行程序都给出详尽的注释)
时间: 2023-05-27 21:01:56 浏览: 76
```
#include<stdio.h>
#include<stdlib.h>
// 定义结构体节点
typedef struct Node {
int data;
struct Node* next;
}Node;
// 创建带头结点链表
Node* createList() {
Node* head = (Node*)malloc(sizeof(Node)); // 头结点
head->next = NULL;
return head;
}
// 头插法插入元素
void insertHead(Node* head,int data) {
Node* newNode = (Node*)malloc(sizeof(Node)); // 新节点
newNode->data = data;
newNode->next = head->next;
head->next = newNode; // 插入到链表头部
}
// 尾插法插入元素
void insertTail(Node* head,int data) {
Node* newNode = (Node*)malloc(sizeof(Node)); // 新节点
newNode->data = data;
newNode->next = NULL;
Node* p = head;
while(p->next != NULL) { // 找到链表尾部
p = p->next;
}
p->next = newNode; // 插入到链表尾部
}
// 按值查找
int search(Node* head,int value) {
Node* p = head->next;
int index = 1; // 节点位置
while(p != NULL) {
if(p->data == value) { // 找到节点
return index;
}
index++;
p = p->next;
}
return -1; // 没找到
}
// 遍历链表
void traverseList(Node* head) {
Node* p = head->next;
printf("链表元素为: ");
while(p != NULL) {
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
// 插入元素(按位置插入)
void insert(Node* head,int value,int index) {
Node* p = head;
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;
int currentIndex = 1;
while(p != NULL) {
if(currentIndex == index) { // 找到要插入位置
newNode->next = p->next;
p->next = newNode;
return;
}
currentIndex++;
p = p->next;
}
}
// 删除元素
void delete(Node* head,int value) {
Node* p = head;
while(p->next != NULL) {
if(p->next->data == value) { // 找到要删除节点
Node* temp = p->next;
p->next = temp->next;
free(temp);
return;
}
p = p->next;
}
}
// 合并链表
Node* mergeList(Node* headA,Node* headB) {
Node* pA = headA->next;
Node* pB = headB->next;
Node* headC = createList();
Node* pC = headC;
while(pA != NULL && pB != NULL) {
if(pA->data <= pB->data) {
pC->next = pA;
pA = pA->next;
} else {
pC->next = pB;
pB = pB->next;
}
pC = pC->next;
}
if(pA != NULL) {
pC->next = pA;
}
if(pB != NULL) {
pC->next = pB;
}
return headC;
}
int main() {
Node* headA = createList(); // 创建链表A
Node* headB = createList(); // 创建链表B
int flag1 = 1,flag2 = 1,value,index;
printf("请依次输入链表A的元素值(以回车键结尾):\n");
while(flag1 != 0) {
scanf("%d",&value);
insertHead(headA,value); // 头插法插入元素
printf("是否继续输入链表A的元素,是请输入1,否请输入0:\n");
scanf("%d",&flag1);
}
printf("请依次输入链表B的元素值(以回车键结尾):\n");
while(flag2 != 0) {
scanf("%d",&value);
insertTail(headB,value); // 尾插法插入元素
printf("是否继续输入链表B的元素,是请输入1,否请输入0:\n");
scanf("%d",&flag2);
}
printf("请输入您要查找的值:\n");
scanf("%d",&value);
if(search(headA,value) != -1) {
printf("要查找的值在链表A中的位置为:%d\n",search(headA,value));
} else {
printf("链表A中并没有您要查找的值!\n");
}
traverseList(headA); // 遍历链表A
printf("请输入您要插入的值和插入位置(位置从1开始):\n");
scanf("%d %d",&value,&index);
insert(headA,value,index); // 按位置插入元素
traverseList(headA); // 遍历链表A
printf("请输入您要删除的值:\n");
scanf("%d",&value);
delete(headA,value); // 删除元素
traverseList(headA); // 遍历链表A
Node* headC = mergeList(headA,headB); // 合并链表
printf("合并后的链表C是: ");
traverseList(headC); // 遍历链表C
return 0;
}
```
阅读全文