用c语言写出一段正确的简单易懂的详细代码实现以单链表作为存储结构,将线性表扩展2倍,假设线性表为(a1,az,…,a),扩展后为(a1,a1,a2,az,…,an,an)
时间: 2024-10-11 11:10:03 浏览: 34
在C语言中,我们可以创建一个新的链表节点数组,然后将原链表的所有元素复制两次。这里是一个简单的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 创建新链表节点并添加数据
Node* createNewNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
return newNode;
}
// 扩展链表,将线性表扩展2倍
Node* extendLinkedList(Node* originalHead, int n) {
// 获取原始链表的最后一个节点
Node* lastNode = originalHead;
while (lastNode->next != originalHead) {
lastNode = lastNode->next;
}
// 新链表头节点
Node* extendedHead = originalHead;
// 遍历原始链表,每两个节点插入一个相同的节点
for (int i = 0; i < n; i++) {
if (i % 2 == 0) { // 插入原节点
Node* newNode = createNewNode(originalHead->data);
newNode->next = extendedHead->next;
extendedHead->next = newNode;
} else { // 插入复制的节点
Node* newNode = createNewNode(lastNode->data);
newNode->next = extendedHead->next;
extendedHead->next = newNode;
}
extendedHead = extendedHead->next; // 移动到下一个位置
}
return extendedHead;
}
// 打印链表
void printList(Node* node) {
while (node != NULL) {
printf("%d ", node->data);
node = node->next;
}
printf("\n");
}
int main() {
// 假设原链表已初始化,如:1 -> 2 -> ... -> n
Node* head = createNewNode(1);
// ... (添加其他节点)
// 获取原链表的节点数
int n = 5; // 更改为你实际链表的节点数
// 扩展链表
head = extendLinkedList(head, n);
// 输出扩展后的链表
printList(head);
return 0;
}
```
这段代码首先遍历原链表获取最后一个节点,然后创建一个新的链表,每两个节点就添加一次原节点或其副本。注意,你需要先设置好原链表的头节点和节点值。
阅读全文