1-1 设链表的存储结构如下: typedef struct Node { Type data; //数据域;Type: 用户定义数据类型 struct Node *next; //指针域 } Node, *LinkList; 实现链表的基本操作。
时间: 2024-09-13 13:15:32 浏览: 55
数据结构c版(1)-线性表之双向带头循环链表代码
链表是一种常见的基础数据结构,由一系列节点组成,每个节点包含数据部分和指向下一个节点的指针。在上述定义中,链表的节点结构体`Node`包含一个类型为`Type`的数据域`data`和一个指向下一个节点的指针域`next`。`Type`通常是用户定义的数据类型,可以根据具体需求来指定。`LinkList`则是`Node`指针类型的别名,代表链表。
链表的基本操作通常包括初始化链表、在链表头部或尾部插入节点、删除节点、查找节点和遍历链表等。以下是这些操作的基本实现:
1. 初始化链表(创建链表头节点):
```c
LinkList InitList() {
LinkList head = (LinkList)malloc(sizeof(Node)); // 分配头节点空间
if (head) {
head->next = NULL; // 初始化时头节点的next指针指向NULL
}
return head;
}
```
2. 在链表头部插入节点:
```c
void InsertHead(LinkList L, Type value) {
LinkList newNode = (LinkList)malloc(sizeof(Node)); // 分配新节点空间
if (newNode) {
newNode->data = value; // 设置新节点的数据域
newNode->next = L->next; // 新节点的next指针指向原链表的第一个节点
L->next = newNode; // 头节点的next指针指向新节点
}
}
```
3. 在链表尾部插入节点:
```c
void InsertTail(LinkList L, Type value) {
LinkList newNode = (LinkList)malloc(sizeof(Node));
LinkList current = L;
if (newNode) {
newNode->data = value;
while (current->next != NULL) { // 寻找链表尾部
current = current->next;
}
current->next = newNode; // 尾节点的next指针指向新节点
}
}
```
4. 删除链表中的节点(以删除第一个匹配值的节点为例):
```c
void DeleteNode(LinkList L, Type value) {
LinkList current = L;
LinkList toDelete = NULL;
while (current->next != NULL) {
if (current->next->data == value) { // 找到需要删除的节点
toDelete = current->next;
current->next = toDelete->next; // 前一个节点的next指向要删除节点的下一个节点
free(toDelete); // 释放要删除的节点
return;
}
current = current->next;
}
}
```
5. 查找链表中的节点:
```c
Type* FindNode(LinkList L, Type value) {
LinkList current = L->next; // 从第一个节点开始查找
while (current != NULL) {
if (current->data == value) {
return ¤t->data; // 返回找到的节点的data指针
}
current = current->next;
}
return NULL; // 未找到返回NULL
}
```
6. 遍历链表:
```c
void TraverseList(LinkList L) {
LinkList current = L->next; // 从第一个节点开始遍历
while (current != NULL) {
printf("%d ", current->data); // 输出当前节点的数据域,这里假设Type为int
current = current->next;
}
printf("\n");
}
```
以上代码仅提供了一个基础框架,实际使用时需要根据具体的`Type`类型和需求进行调整和补充。
阅读全文