C循环链表代码实现,主函数调用

本文介绍了如何在C语言中实现循环单链表,包括引入表头结点,设置表长和表尾指针。表头结点仅用于存储指向第一个元素的指针,表尾指针的next指针则指向表头,确保可以从链表任一位置开始遍历所有元素。
摘要由CSDN通过智能技术生成

C循环单链表代码实现,主函数调用

引入了一个表头结点,同时循环单链表有表长以及表尾指针属性。表头结点不存放值,只存放指向第一个元素的指针域;同时表尾指针的next指向表头结点;即从链表任意位置出发都可以遍历完所有链表元素;

#include <stdio.h>
#include <stdlib.h>

typedef int ListItem;     // 表元素类型
typedef ListItem *addr;   // 表元素指针类型
#define eq(A, B) (A == B) // 元素相等

typedef struct node *link; // 表结点指针类型
typedef struct node
{
   
    ListItem element; // 表元素
    link next;        // 指向下一个结点的指针域
} Node;

link NewNode() // 新建一个结点
{
   
    return (link)malloc(sizeof(Node));
}

typedef struct clist *List;
typedef struct clist
{
   
    int n;     // 表长
    link last; // 链表尾指针
} Clist;

List ListInit();                            // 表结构初始化,返回一个结构体指针
int ListEmpty(List L);                      // 测试表是否为空
int ListLength(List L);                     // 表L的长度
ListItem ListRetrieve(int k, List L);       // 返回表L位置k的元素
int ListLocate(ListItem x, List L);         // 元素x在表L的位置
void ListInsert(int k, ListItem x, List L); // 在表L索引k的位置插入元素x
ListItem ListDelete(int k, List L)
### 回答1: C语言使用链表实现冒泡排序的代码实现如下: struct listNode { int data; struct listNode *next; }; void BubbleSort(struct listNode* head) { struct listNode *p, *q; int temp; if (head == NULL || head->next == NULL) return; for (p = head; p->next != NULL; p = p->next) { for (q = head; q->next != NULL; q = q->next) { if (q->data > q->next->data) { temp = q->data; q->data = q->next->data; q->next->data = temp; } } } } ### 回答2: 下面是用C语言实现冒泡排序算法的链表形式的代码: ```c #include <stdio.h> #include <stdlib.h> struct Node { int data; struct Node* next; }; struct Node* createNode(int data) { struct Node* newNode = (struct Node*) malloc(sizeof(struct Node)); if (newNode == NULL) { printf("内存分配失败\n"); exit(1); } newNode->data = data; newNode->next = NULL; return newNode; } struct Node* insertNode(struct Node* head, int data) { if (head == NULL) { return createNode(data); } else { struct Node* newNode = createNode(data); newNode->next = head; return newNode; } } struct Node* bubbleSort(struct Node* head) { if (head == NULL || head->next == NULL) { return head; } struct Node* current; struct Node* next; int swapped; do { swapped = 0; current = head; while (current->next != NULL) { next = current->next; if (current->data > next->data) { int temp = current->data; current->data = next->data; next->data = temp; swapped = 1; } current = next; } } while (swapped); return head; } void printList(struct Node* head) { struct Node* current = head; while (current != NULL) { printf("%d ", current->data); current = current->next; } printf("\n"); } int main() { struct Node* head = NULL; int n, data; printf("请输入要排序的数字个数:"); scanf("%d", &n); for (int i = 0; i < n; i++) { printf("请输入第%d个数字:", i+1); scanf("%d", &data); head = insertNode(head, data); } printf("排序前的链表:"); printList(head); head = bubbleSort(head); printf("排序后的链表:"); printList(head); return 0; } ``` 以上代码创建了一个称为 Node 的结构体,表示链表中的节点。`createNode` 函数用于创建新的节点,`insertNode` 函数用于向链表插入节点。`bubbleSort` 函数用于实现冒泡排序算法并返回排好序的链表头节点。 在主函数中,首先获取要排序的数字个数,并逐个插入到链表中。然后调用 `bubbleSort` 对链表进行排序,最后打印排序前和排序后的链表。 请注意,这里的冒泡排序算法是从头节点开始两两比较相邻节点的值,如果顺序不对则交换。算法会一直遍历链表直到没有发生交换操作,即达到最佳排序顺序为止。 ### 回答3: 冒泡排序是一种简单的排序算法,通过反复交换相邻元素的位置来实现排序。使用链表实现冒泡排序需要以下步骤: 1. 定义链表节点结构体,包含一个整型数据域和一个指向下一个节点的指针域。 2. 创建链表,并向其中插入待排序的元素。 3. 定义一个排序函数,用于对链表进行冒泡排序。函数内部使用两层循环,外层循环遍历链表的节点个数次,内层循环进行相邻节点的比较和交换操作。 在内层循环中,如果当前节点的数据大于下一个节点的数据,则交换它们的位置;否则,继续比较下一对节点。 通过这样的循环操作,每次内层循环结束后,链表最后的节点就是当前未排序部分的最大值。 外层循环重复执行该过程,每次只需要遍历到上一轮未排序部分的前一个节点。 4. 在排序函数中添加适当的边界判断和指针操作,确保链表正确排序。 5. 输出排序后的链表。 以下是一个使用链表实现冒泡排序的代码示例: ```c #include <stdio.h> #include <stdlib.h> // 链表节点结构体 typedef struct Node { int data; // 数据域 struct Node* next; // 指针域 } Node; // 创建链表 Node* createList(int arr[], int size) { Node* head = NULL; Node* tail = NULL; for (int i = 0; i < size; i++) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = arr[i]; newNode->next = NULL; if (head == NULL) { head = newNode; tail = newNode; } else { tail->next = newNode; tail = newNode; } } return head; } // 冒泡排序 void bubbleSort(Node* head) { if (head == NULL || head->next == NULL) { return; } Node* p; Node* q = NULL; int swapped; do { swapped = 0; p = head; while (p->next != q) { if (p->data > p->next->data) { int temp = p->data; p->data = p->next->data; p->next->data = temp; swapped = 1; } p = p->next; } q = p; } while (swapped); } // 打印链表 void printList(Node* head) { Node* p = head; while (p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); } int main() { int arr[] = {4, 2, 6, 3, 1, 5}; int size = sizeof(arr) / sizeof(arr[0]); Node* head = createList(arr, size); bubbleSort(head); printList(head); return 0; } ``` 运行结果为:1 2 3 4 5 6,表示链表已经成功按照升序进行冒泡排序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值