你好,可以用C语言帮我实现表头结点单链表的建立、清空、插入、删除、查找、修改、逆置和排序等运算
时间: 2023-09-29 11:03:15 浏览: 110
当然可以,以下是基于表头结点的单链表的C语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表结点
typedef struct node {
int data;
struct node* next;
} Node, *LinkList;
// 初始化链表,建立头结点
LinkList initList() {
LinkList head = (LinkList) malloc(sizeof(Node));
head->next = NULL;
return head;
}
// 清空链表,释放所有结点
void clearList(LinkList head) {
Node* p = head->next;
while (p != NULL) {
Node* q = p->next;
free(p);
p = q;
}
head->next = NULL;
}
// 在指定位置插入新结点
void insertNode(LinkList head, int pos, int data) {
Node* p = head;
int i = 0;
while (p != NULL && i < pos - 1) {
p = p->next;
i++;
}
if (p == NULL || i > pos - 1) {
printf("插入结点位置不合法\n");
return;
}
Node* newNode = (Node*) malloc(sizeof(Node));
newNode->data = data;
newNode->next = p->next;
p->next = newNode;
}
// 删除指定位置的结点
void deleteNode(LinkList head, int pos) {
Node* p = head;
int i = 0;
while (p->next != NULL && i < pos - 1) {
p = p->next;
i++;
}
if (p->next == NULL || i > pos - 1) {
printf("删除结点位置不合法\n");
return;
}
Node* q = p->next;
p->next = q->next;
free(q);
}
// 查找指定位置的结点
Node* getNode(LinkList head, int pos) {
Node* p = head->next;
int i = 1;
while (p != NULL && i < pos) {
p = p->next;
i++;
}
if (p == NULL || i > pos) {
printf("查找结点位置不合法\n");
return NULL;
}
return p;
}
// 修改指定位置的结点
void modifyNode(LinkList head, int pos, int data) {
Node* p = getNode(head, pos);
if (p != NULL) {
p->data = data;
}
}
// 链表逆置
void reverseList(LinkList head) {
if (head->next == NULL || head->next->next == NULL) {
return;
}
Node* p = head->next;
Node* q = p->next;
p->next = NULL;
while (q != NULL) {
Node* r = q->next;
q->next = p;
p = q;
q = r;
}
head->next = p;
}
// 链表排序
void sortList(LinkList head) {
Node* p = head->next;
while (p != NULL) {
Node* q = p->next;
while (q != NULL) {
if (p->data > q->data) {
int temp = p->data;
p->data = q->data;
q->data = temp;
}
q = q->next;
}
p = p->next;
}
}
// 打印链表
void printList(LinkList head) {
Node* p = head->next;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main() {
LinkList list = initList();
insertNode(list, 1, 1);
insertNode(list, 2, 3);
insertNode(list, 3, 2);
printf("原始链表:");
printList(list);
deleteNode(list, 2);
printf("删除结点之后的链表:");
printList(list);
Node* node = getNode(list, 2);
if (node != NULL) {
printf("查找到的结点的值为:%d\n", node->data);
}
modifyNode(list, 2, 4);
printf("修改结点之后的链表:");
printList(list);
reverseList(list);
printf("逆置后的链表:");
printList(list);
sortList(list);
printf("排序后的链表:");
printList(list);
clearList(list);
printf("清空链表之后的链表:");
printList(list);
return 0;
}
```
以上代码实现了表头结点单链表的建立、清空、插入、删除、查找、修改、逆置和排序等运算。
阅读全文