单链表的查找、插入与删除。设计算法,实现线性结构上的单链表的产生以及元素的查找、插入与删除。具体实现要求: 1、从键盘输入20个整数,产生带表头的单链表,并输出结点值; 2、从键盘输入1个整数,在单链表中查找该结点。若找到,则显示“找到了”;否则,则显示“找不到”; 3、从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插入在对应位置上,输出单链表所有结点值,观察输出结果; 4、从键盘输入1个整数,表示欲删除结点的位置,输出单链表所有结点值,观察输出结果;
时间: 2024-02-28 18:53:13 浏览: 30
以下是针对该问题的解决方案:
1. 产生带表头的单链表并输出结点值:
首先需要定义单链表的结构体和结点结构,如下所示:
```c
typedef struct Node{
int data;
struct Node *next;
}Node, *List;
List createList(){
List head = (List)malloc(sizeof(Node)); //创建头结点
head->next = NULL; //将头结点指向NULL
return head;
}
```
接着可以通过以下函数来产生单链表:
```c
void createNode(List head){
Node *p; int i, x;
p = head; //p指向头结点
printf("请输入20个整数:\n");
for(i=0; i<20; i++){
scanf("%d", &x); //输入数据
Node *s = (Node *)malloc(sizeof(Node)); //创建新结点
s->data = x; //新结点存储数据
s->next = NULL; //新结点的指针域指向NULL
p->next = s; //上一个结点的指针域指向新结点
p = s; //p指向新结点
}
}
```
最后可以通过以下函数输出单链表的结点值:
```c
void printList(List head){
Node *p = head->next;
while(p){
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
```
2. 在单链表中查找该结点:
可以通过以下函数来实现在单链表中查找指定结点:
```c
void searchNode(List head){
int x; Node *p = head->next;
printf("请输入要查找的整数:\n");
scanf("%d", &x); //输入要查找的整数
while(p && p->data != x){ //遍历单链表查找指定结点
p = p->next;
}
if(p){
printf("找到了\n"); //找到了
}
else{
printf("找不到\n"); //找不到
}
}
```
3. 将x插入在对应位置上并输出单链表所有结点值:
以下函数可以实现在指定位置处插入新结点并输出单链表所有结点值:
```c
void insertNode(List head){
int i, x; Node *p = head;
printf("请输入要插入的位置和数值:\n");
scanf("%d%d", &i, &x); //输入要插入的位置和数值
for(int j=0; j<i-1 && p; j++){ //遍历单链表找到指定位置
p = p->next;
}
if(!p){ //插入位置不合法
printf("插入位置不合法\n");
return;
}
Node *s = (Node *)malloc(sizeof(Node)); //创建新结点
s->data = x; //新结点存储数据
s->next = p->next; //新结点的指针域指向当前结点的后继结点
p->next = s; //当前结点的指针域指向新结点
printList(head); //输出单链表所有结点值
}
```
4. 删除指定位置的结点并输出单链表所有结点值:
以下函数可以实现删除指定位置的结点并输出单链表所有结点值:
```c
void deleteNode(List head){
int i; Node *p = head;
printf("请输入要删除的位置:\n");
scanf("%d", &i); //输入要删除的位置
for(int j=0; j<i-1 && p->next; j++){ //遍历单链表找到指定位置的前驱结点
p = p->next;
}
if(!p->next){ //删除位置不合法
printf("删除位置不合法\n");
return;
}
Node *q = p->next; //q指向要删除的结点
p->next = q->next; //当前结点的指针域指向要删除结点的后继结点
free(q); //释放要删除的结点
printList(head); //输出单链表所有结点值
}
```
最后,可以将以上函数整合起来,实现单链表的查找、插入与删除。完整代码如下所示:
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)