实现线性表的链式存储定义,完成单链表的创建(头插法、尾插法)、插入、删除、查找等常用操作,将线性链表逆置,即最后一个结点变成第一个结点,原来倒数第二个结点变成第二个结点,以此类推。
时间: 2023-06-24 10:04:29 浏览: 92
链表的相关操作 创建,删除,查找,插入,逆置,等
5星 · 资源好评率100%
线性表的链式存储定义:
定义一个结构体表示链表中的每个节点,包含数据域和指向下一个节点的指针域。
```c
typedef struct ListNode {
int data;
struct ListNode *next;
} ListNode;
```
单链表的创建:
单链表的创建可以采用头插法或尾插法,下面分别介绍。
头插法创建单链表:
```c
ListNode* createListHead() {
ListNode *head = NULL;
ListNode *p;
int x;
printf("请输入数据,以-1结束:");
scanf("%d", &x);
while (x != -1) {
p = (ListNode*)malloc(sizeof(ListNode));
p->data = x;
p->next = head;
head = p;
scanf("%d", &x);
}
return head;
}
```
尾插法创建单链表:
```c
ListNode* createListTail() {
ListNode *head = NULL;
ListNode *tail = NULL;
ListNode *p;
int x;
printf("请输入数据,以-1结束:");
scanf("%d", &x);
while (x != -1) {
p = (ListNode*)malloc(sizeof(ListNode));
p->data = x;
p->next = NULL;
if (head == NULL) {
head = p;
} else {
tail->next = p;
}
tail = p;
scanf("%d", &x);
}
return head;
}
```
插入操作:
在第i个位置插入一个元素x,需要先找到第i-1个位置的节点p,然后新建一个节点q,将x赋值给q的数据域,然后将q插入到p后面。
```c
void insert(ListNode *head, int i, int x) {
ListNode *p = head;
ListNode *q;
int j = 0;
while (p != NULL && j < i - 1) {
p = p->next;
j++;
}
if (p == NULL || j > i - 1) {
printf("插入位置错误\n");
return;
}
q = (ListNode*)malloc(sizeof(ListNode));
q->data = x;
q->next = p->next;
p->next = q;
}
```
删除操作:
删除第i个位置的节点,需要先找到第i-1个位置的节点p,然后将p的next指针指向第i+1个位置的节点。
```c
void delete(ListNode *head, int i) {
ListNode *p = head;
ListNode *q;
int j = 0;
while (p != NULL && j < i - 1) {
p = p->next;
j++;
}
if (p == NULL || p->next == NULL || j > i - 1) {
printf("删除位置错误\n");
return;
}
q = p->next;
p->next = q->next;
free(q);
}
```
查找操作:
查找第i个位置的节点,需要遍历链表,找到第i个位置的节点。
```c
ListNode* find(ListNode *head, int i) {
ListNode *p = head;
int j = 0;
while (p != NULL && j < i) {
p = p->next;
j++;
}
if (p == NULL || j > i) {
printf("查找位置错误\n");
return NULL;
}
return p;
}
```
逆置操作:
将单链表逆置,可以采用头插法的思想,从第二个节点开始,将每个节点插入到头节点的后面。
```c
void reverse(ListNode *head) {
ListNode *p = head->next;
head->next = NULL;
ListNode *q;
while (p != NULL) {
q = p->next;
p->next = head;
head = p;
p = q;
}
}
```
完整代码如下:
阅读全文