编写一个C语言程序,要求依次实现带头结点的链表的以下功能: 链表A和链表B、按头插法建立链表A(用键盘依次输入链表A的元素值),按尾插法建立链表B(用键盘依次输入链表B的元素值)、链表A的按值查找(在键盘上输入要查找链表A的值,如果能找到,则打印要查找的值的位置)、链表A的插入(在键盘上输入要插入的值和插入的位置)、链表A的删除(在键盘上输入要删除的值)、遍历输出链表A、遍历输出链表B,最后再把链表A和链表B进行合并,合并之后成链表C,要求链表C仍有序。(要求每一行程序都给出详尽的注释)
时间: 2023-05-27 11:02:00 浏览: 105
C语言实现带头结点的链表的创建、查找、插入、删除操作
```
#include <stdio.h>
#include <stdlib.h>
typedef struct Node{ //定义结构体,表示链表的节点
int data; //链表节点中存放的元素值
struct Node *next; //链表节点的下一个节点指针
}Node, *LinkedList; //定义链表的别名LinkedList
//函数声明
LinkedList createListFromHead();
LinkedList createListFromTail();
int findInList(LinkedList list, int value);
void insertToList(LinkedList list, int value, int position);
void deleteFromList(LinkedList list, int value);
void printList(LinkedList list);
LinkedList mergeLists(LinkedList list1, LinkedList list2);
int main(){
LinkedList listA, listB, listC;
//用头插法创建链表A
printf("请输入链表A:\n");
listA = createListFromHead();
//用尾插法创建链表B
printf("请输入链表B:\n");
listB = createListFromTail();
//在链表A中查找元素
int value;
printf("请输入要查找的元素:\n");
scanf("%d", &value);
int position = findInList(listA, value);
if(position == -1){
printf("在链表A中未找到该元素!\n");
}else{
printf("在链表A中找到该元素,位置为%d!\n", position);
}
//向链表A中插入元素
int newValue, newPos;
printf("请输入要插入的元素和插入的位置:\n");
scanf("%d%d", &newValue, &newPos);
insertToList(listA, newValue, newPos);
printf("插入后的链表A为:\n");
printList(listA);
//从链表A中删除元素
int delValue;
printf("请输入要删除的元素:\n");
scanf("%d", &delValue);
deleteFromList(listA, delValue);
printf("删除后的链表A为:\n");
printList(listA);
//遍历输出链表A
printf("链表A输出结果为:\n");
printList(listA);
//遍历输出链表B
printf("链表B输出结果为:\n");
printList(listB);
//合并链表A和链表B
listC = mergeLists(listA, listB);
printf("合并后的链表C输出结果为:\n");
printList(listC);
return 0;
}
//实现函数
//用头插法创建链表
LinkedList createListFromHead(){
LinkedList head = (LinkedList)malloc(sizeof(Node)); //创建头结点
head->next = NULL;
int value;
Node *p;
while(scanf("%d", &value) && value != -1){ //循环输入链表中的元素
p = (Node*)malloc(sizeof(Node));
p->data = value;
p->next = head->next;
head->next = p;
}
return head;
}
//用尾插法创建链表
LinkedList createListFromTail(){
LinkedList head = (LinkedList)malloc(sizeof(Node)); //创建头结点
head->next = NULL;
int value;
Node *p, *tail = head; //tail用于记录链表尾部节点的指针
while(scanf("%d", &value) && value != -1){ //循环输入链表中的元素
p = (Node*)malloc(sizeof(Node));
p->data = value;
p->next = NULL;
tail->next = p; //将新节点插入到链表尾部
tail = p;
}
return head;
}
//在链表中查找元素
int findInList(LinkedList list, int value){
Node *p = list->next;
int pos = 1;
while(p != NULL && p->data != value){ //当尚未找到元素且链表未到达末尾时
p = p->next;
pos++;
}
if(p == NULL){ //未找到元素
return -1;
}else{ //找到元素
return pos;
}
}
//向链表中插入元素
void insertToList(LinkedList list, int value, int position){
Node *p = list;
int pos = 0;
while(p != NULL && pos < position - 1){ //寻找需要插入的位置
p = p->next;
pos++;
}
if(p == NULL || pos > position - 1){ //未找到插入位置,或插入位置非法
printf("插入位置非法!\n");
return;
}
Node *newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;
newNode->next = p->next;
p->next = newNode;
}
//从链表中删除元素
void deleteFromList(LinkedList list, int value){
Node *p = list, *q;
while(p->next != NULL && p->next->data != value){ //查找需要删除的元素
p = p->next;
}
if(p->next == NULL){ //未找到需要删除的元素
printf("链表中未找到需要删除的元素!\n");
return;
}
q = p->next; //q记录需要删除的节点的指针
p->next = q->next;
free(q);
}
//遍历输出链表
void printList(LinkedList list){
Node *p = list->next;
while(p != NULL){ //循环输出链表中的元素
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
//合并两个有序链表
LinkedList mergeLists(LinkedList list1, LinkedList list2){
LinkedList headC = (LinkedList)malloc(sizeof(Node)); //创建链表C的头结点
headC->next = NULL;
Node *p = list1->next, *q = list2->next, *r = headC; //p为指向链表1当前节点的指针,q为指向链表2当前节点的指针,r为指向链表C尾部的指针
while(p != NULL && q != NULL){ //循环直到链表1或链表2到达末尾
if(p->data <= q->data){ //将较小的节点插入到链表C中
r->next = p;
r = p;
p = p->next;
}else{
r->next = q;
r = q;
q = q->next;
}
}
if(p != NULL){ //将剩余的节点插入到链表C中
r->next = p;
}
if(q != NULL){
r->next = q;
}
return headC;
}
```
阅读全文