创建一个由6个结点的单向链表,实现结点的增加、删除、查找、移动、遍历显示等功能。 段落格式 字体 字号
时间: 2023-06-08 15:06:39 浏览: 94
不带表头结点的线性链表的实现
很高兴能与您进行对话。对于您的问题,可以使用以下代码实现:
#include <stdio.h>
#include <stdlib.h>
//定义链表结点
typedef struct node {
int data; //数据域
struct node *next; //指针域
} ListNode, *LinkedList; //LinkedList表示指向链表结构体的指针
//创建链表
void createList(LinkedList *L) {
int n, i;
ListNode *p, *q;
printf("请输入链表结点数:");
scanf("%d", &n);
*L = (LinkedList)malloc(sizeof(ListNode)); //创建头结点
(*L)->next = NULL; //头结点的指针域为空
q = *L; //初始化尾指针
printf("请输入%d个结点的数据:", n);
for (i = 1; i <= n; i++) {
p = (ListNode*)malloc(sizeof(ListNode)); //创建新结点
scanf("%d", &p->data); //输入新结点数据
p->next = NULL; //新结点的指针域为空
q->next = p; //尾指针指向新结点
q = p; //尾指针后移
}
}
//打印链表
void printList(LinkedList L) {
ListNode *p;
printf("链表结点如下:");
p = L->next; //从第一个结点开始遍历
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
//插入结点
void insertNode(LinkedList L) {
int pos, i;
ListNode *p, *q;
printf("请输入要插入的位置:");
scanf("%d", &pos);
p = L->next; //从第一个结点开始遍历
for (i = 1; i < pos && p != NULL; i++) {
p = p->next;
}
if (p == NULL) {
printf("插入位置无效!\n");
return;
}
q = (ListNode*)malloc(sizeof(ListNode)); //创建新结点
printf("请输入要插入的数据:");
scanf("%d", &q->data);
q->next = p->next; //新结点指向后继结点
p->next = q; //前驱结点指向新结点
}
//删除结点
void deleteNode(LinkedList L) {
int pos, i;
ListNode *p, *q;
printf("请输入要删除的位置:");
scanf("%d", &pos);
p = L->next; //从第一个结点开始遍历
for (i = 1; i < pos && p != NULL; i++) {
p = p->next;
}
if (p == NULL || p->next == NULL) {
printf("删除位置无效!\n");
return;
}
q = p->next; //要删除的结点
p->next = q->next; //前驱结点指向后继结点
free(q); //释放删除结点的空间
}
//查找结点
void findNode(LinkedList L) {
int x;
ListNode *p;
printf("请输入要查找的数据:");
scanf("%d", &x);
p = L->next; //从第一个结点开始遍历
while (p != NULL && p->data != x) {
p = p->next;
}
if (p == NULL) {
printf("没有找到该结点!\n");
} else {
printf("结点位置为:%d\n", p);
}
}
//移动结点
void moveNode(LinkedList L) {
int src, dest, i;
ListNode *p, *q, *pre;
printf("请输入要移动的结点位置:");
scanf("%d", &src);
printf("请输入移动目标位置:");
scanf("%d", &dest);
if (src == dest) {
printf("移动位置无效!\n");
return;
}
p = L->next; //从第一个结点开始遍历
for (i = 1; i < src && p != NULL; i++) {
pre = p;
p = p->next;
}
if (p == NULL || p->next == NULL) {
printf("移动位置无效!\n");
return;
}
q = p->next; //待移动结点
p->next = q->next; //前驱结点指向后继结点
if (src < dest) { //向后移动
q->next = p->next; //插入到后继结点之后
p->next = q;
} else { //向前移动
q->next = p; //插入到前驱结点之前
pre->next = q;
}
}
int main() {
LinkedList L; //定义链表指针
int choice; //保存用户选择操作的编号
while (1) {
printf("请选择操作:\n");
printf("1、创建链表\n");
printf("2、插入结点\n");
printf("3、删除结点\n");
printf("4、查找结点\n");
printf("5、移动结点\n");
printf("6、打印链表\n");
printf("0、退出程序\n");
printf("请选择:");
scanf("%d", &choice);
switch (choice) {
case 1:
createList(&L);
break;
case 2:
insertNode(L);
break;
case 3:
deleteNode(L);
break;
case 4:
findNode(L);
break;
case 5:
moveNode(L);
break;
case 6:
printList(L);
break;
case 0:
return 0;
default:
printf("输入错误,请重新选择操作!\n");
}
}
return 0;
}
阅读全文