数据结构c语言1.定义单向循环链表节点类型。 2. 尾插法创建单向循环链表并返回头指针。 3.定义打印输出单向循环链表节点。 4.在main函数中编写测试(1)分别创建循环链表La和Lb (2)编写合并算法,存储到Lc (3)编写输出 Lc验证合并结果
时间: 2024-09-27 15:14:26 浏览: 49
个人C语言学习实录练习题-链表.数据结构.快速排序练习.rar
在 C 语言中,我们首先需要定义单向循环链表的节点结构体。假设节点包含数据域 data 和指向下一个节点的指针 next:
```c
typedef struct Node {
int data; // 节点数据
struct Node* next; // 指向下一个节点的指针,如果是循环链表,则next指向当前节点自身
} ListNode;
```
接下来是尾插法创建单向循环链表的函数,这里以头插法为例,稍作修改即可得到循环链表:
```c
ListNode* createCircularList(int arr[], int n) {
ListNode* head = NULL;
ListNode* tail = NULL;
for (int i = 0; i < n; ++i) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->data = arr[i];
newNode->next = head; // 初始化新节点的 next 指向头部
if (!head) { // 如果链表为空,头尾同时初始化
head = newNode;
tail = newNode;
} else {
tail->next = newNode; // 否则,尾部节点的 next 指向新节点
tail = newNode; // 更新尾部指针
}
}
// 创建循环链表
tail->next = head; // 设置尾节点的 next 指向头部形成环
return head;
}
```
定义打印输出单向循环链表的函数:
```c
void printCircularList(ListNode* head) {
if (head == NULL) {
printf("链表为空");
} else {
ListNode* current = head;
do {
printf("%d ", current->data);
current = current->next;
} while (current != head); // 循环直到回到起点
}
}
```
在 main 函数中创建、合并和打印链表:
```c
int main() {
int arrLa[] = {1, 2, 3};
int arrLb[] = {4, 5, 6};
ListNode* La = createCircularList(arrLa, sizeof(arrLa) / sizeof(arrLa[0]));
ListNode* Lb = createCircularList(arrLb, sizeof(arrLb) / sizeof(arrLb[0]));
// 合并操作,这通常涉及到遍历两个链表,然后将它们链接在一起,这里仅作为概念演示,实际合并逻辑可能更复杂
ListNode* Lc = mergeLists(La, Lb);
printCircularList(Lc);
free(La);
free(Lb);
free(Lc);
return 0;
}
// 定义合并两个链表的示例函数,这里简化为连接两个链表
ListNode* mergeLists(ListNode* a, ListNode* b) {
// 实现细节...
return b; // 示例:直接返回第二个链表,因为这里简单起见,没有真正合并
}
```
阅读全文