请定义一个完成下表通讯录的线性表链式存储结构的结点结构体 其表结构如下: 姓名 住址 电话 QQ 张青 2-1-104 1594003484 125128104 刘强 3-2-314 1393654230 125128104
时间: 2024-10-16 21:03:56 浏览: 12
在定义一个用于通讯录的线性表链式存储结构的结点结构体时,我们可以按照给定的字段创建一个数据结构,比如在C语言中:
```c
typedef struct Node {
char name[20]; // 姓名,最多容纳20个字符
char address[20]; // 住址,最多容纳20个字符
int phone; // 电话号码
int qq; // QQ号码
} ContactNode;
// 创建联系人节点的初始化函数
void initContactNode(ContactNode* node, const char* name, const char* address, int phone, int qq) {
strcpy(node->name, name);
strcpy(node->address, address);
node->phone = phone;
node->qq = qq;
}
// 示例联系人数据
ContactNode contact1 = {"张青", "2-1-104", 1594003484, 125128104};
ContactNode contact2 = {"刘强", "3-2-314", 1393654230, 125128104};
相关问题
用c++写 线性表链式存储结构下基本操作的实现(初始化、建表、取值、查找、插入、删除、两个非递减有序链表的归并等
在C++中,线性表链式存储结构的基本操作通常涉及到`Node`类的设计,包含数据域和指向下一个节点的指针。以下是这些操作的简单实现:
```cpp
#include <iostream>
// 定义链表节点结构体
struct Node {
int data;
Node* next;
};
// 初始化一个空链表
Node* createList() {
return nullptr;
}
// 创建一个新的链表节点并插入元素
Node* insert(Node*& head, int value) {
if (head == nullptr) {
head = new Node{value, nullptr};
} else {
Node* newNode = new Node{value, head->next};
head->next = newNode;
}
return head;
}
// 取值操作(遍历)
int getValue(const Node* node) {
if (node != nullptr) {
return node->data;
} else {
std::cout << "链表为空" << std::endl;
return -1; // 返回默认值或抛出异常
}
}
// 查找特定值
Node* find(const Node* head, int value) {
Node* current = head;
while (current != nullptr) {
if (current->data == value) {
return current;
}
current = current->next;
}
return nullptr;
}
// 删除某个节点(这里仅考虑头节点)
void deleteNode(Node*& head, int value) {
if (head != nullptr && head->data == value) {
Node* temp = head;
head = head->next;
delete temp;
} else {
Node* current = head;
while (current->next != nullptr && current->next->data != value) {
current = current->next;
}
if (current->next != nullptr) {
Node* toDelete = current->next;
current->next = current->next->next;
delete toDelete;
}
}
}
// 归并两个非递减有序链表
Node* mergeSortedLists(Node* list1, Node* list2) {
if (list1 == nullptr) return list2;
if (list2 == nullptr) return list1;
if (list1->data <= list2->data) {
list1->next = mergeSortedLists(list1->next, list2);
return list1;
} else {
list2->next = mergeSortedLists(list1, list2->next);
return list2;
}
}
// 打印链表
void printList(const Node* node) {
while (node != nullptr) {
std::cout << node->data << " -> ";
node = node->next;
}
std::cout << "nullptr\n";
}
线性表链式存储结构下基本操作的实现(初始化、建表、取值、查找、插入、删除、两个非递减有序链表的归并等)。
线性表的链式存储结构是一种动态的数据结构,其主要特点是数据元素之间通过链接(指针)相连。以下是链表中一些基本操作的实现:
1. **初始化**:
初始化一个空链表,创建一个链表节点,并将其头结点设置为`NULL`。
```c++
struct Node {
int data;
Node* next;
};
Node* createList() {
return nullptr; // 创建一个空链表
}
```
2. **建表**:
对于给定的数据序列,遍历并创建新节点,然后连接它们。
```c++
void buildList(Node** head, const std::vector<int>& data) {
*head = new Node{data[0], nullptr};
for (int i = 1; i < data.size(); i++) {
Node* newNode = new Node{data[i], *head};
*head = newNode;
}
}
```
3. **取值**:
节点访问通过指针逐个进行,直到找到目标位置。
```c++
int getValue(Node* current) {
if (current != nullptr) {
return current->data;
} else {
return -1; // 如果到达空指针,表示未找到
}
}
```
4. **查找**:
从头开始,如果数据匹配则返回,不匹配继续向下。
```c++
Node* findValue(Node* head, int value) {
while (head != nullptr && head->data != value) {
head = head->next;
}
return head;
}
```
5. **插入**:
在指定位置插入新节点,通常需要处理边界条件。
```c++
void insertValue(Node** head, int value, int position) {
Node* newNode = new Node{value, nullptr};
if (position == 0) {
newNode->next = *head;
*head = newNode;
} else {
Node* current = *head;
for (int i = 0; i < position - 1 && current != nullptr; i++, current = current->next) {}
newNode->next = current->next;
current->next = newNode;
}
}
```
6. **删除**:
删除特定位置或特定值的节点,同样要考虑边界条件。
```c++
void deleteValue(Node** head, int value) {
if (*head == nullptr) {
return;
}
if (*head->data == value) {
Node* temp = *head;
*head = *head->next;
delete temp;
return;
}
Node* current = *head;
while (current->next != nullptr && current->next->data != value) {
current = current->next;
}
if (current->next != nullptr) {
Node* toDelete = current->next;
current->next = current->next->next;
delete toDelete;
}
}
```
7. **合并两个非递减有序链表**:
可以采用双指针法,比较当前节点的值,将较小的那个放入结果链表。
```c++
Node* mergeLists(Node* list1, Node* list2) {
Node* resultHead = nullptr, *resultTail = nullptr;
while (list1 && list2) {
if (list1->data <= list2->data) {
if (!resultHead) {
resultHead = resultTail = list1;
} else {
resultTail->next = list1;
resultTail = list1;
}
list1 = list1->next;
} else {
if (!resultHead) {
resultHead = resultTail = list2;
} else {
resultTail->next = list2;
resultTail = list2;
}
list2 = list2->next;
}
}
if (list1) {
resultTail->next = list1;
} else {
resultTail->next = list2;
}
return resultHead;
}
阅读全文