链表题_1

本文详细介绍了单链表的基本操作,包括从尾到头打印、删除非尾节点及在指定节点前插入新节点的方法,并提供了具体的C语言实现代码。

typedef int Data;
typedef struct List
{
Data arrary;
struct List* next;
}List;


List* BuyList(Data x)
{
List* node = (List*)malloc(sizeof(List));
node->next = NULL;
node->arrary = x;
return node;
}

void PushFront(List** pphead,Data x)
{
if ((*pphead) == NULL)
{
*pphead = BuyList(x);
}
else
{
List* start = *pphead;
start = BuyList(x);
start->next = *pphead;
*pphead = start;
}
}

1.从尾到头打印单链表

void ReversList(List**pphead)
{
List* Node = BuyList((*pphead)->arrary);
List* Start = *pphead;
List* tmp=Node;
while (Start->next!=NULL)
{
Start = Start->next;
PushFront(&Node,Start->arrary);
}
*pphead=Node;
PrintList(Node);
}

2.删除一个无头的非尾节点

void EarsePos(List* Pos)
{
List* Node = Pos;
Node = Node->next;
Pos->arrary = Node->arrary;
Pos->next = Node->next;
}

3.在无头单链表的一个节点前插入一个节点 

void InserPos(List* pos, Data x)
{
assert(pos->next != NULL);
List* node = pos->next;
pos->next = BuyList(pos->arrary);
List* tmp = pos->next;
tmp->next = node;
pos->arrary = x;
}

### 链表数据结构练习 以下是关于链表的一些经典练习目及其解析: #### 计算链表长度 为了计算链表的长度,可以通过遍历整个链表并计数节点的数量来实现。具体方法是从头节点出发,逐步移动指针直到到达链表末尾[^2]。 ```c int getLength(struct Node* head) { int count = 0; struct Node* current = head; while (current != NULL) { count++; current = current->next; } return count; } ``` #### 删除指定值的所有节点 删除链表中所有等于给定值 `val` 的节点是一个常见的操作。此过程涉及调整前驱节点和后继节点之间的链接关系[^3]。 ```c struct Node* removeElements(struct Node* head, int val) { struct Node dummy = {0}; dummy.next = head; struct Node *prev = &dummy, *curr = head; while (curr != NULL) { if (curr->data == val) { prev->next = curr->next; free(curr); curr = prev->next; } else { prev = curr; curr = curr->next; } } return dummy.next; } ``` #### 创建图书信息链表 可以设计一个包含图书信息(书号、书名、价格)的链表,并通过输入相应数据完成链表的构建。之后还可以统计链表中的图书数量以及逐行打印每本书的信息[^4]。 ```c typedef struct BookNode { char id[20]; char name[50]; float price; struct BookNode* next; } BookNode; BookNode* createBook(char id[], char name[], float price) { BookNode* newNode = malloc(sizeof(BookNode)); strcpy(newNode->id, id); strcpy(newNode->name, name); newNode->price = price; newNode->next = NULL; return newNode; } void addBook(BookNode** headRef, BookNode* newBook) { if (*headRef == NULL) { *headRef = newBook; } else { BookNode* temp = *headRef; while (temp->next != NULL) { temp = temp->next; } temp->next = newBook; } } void printBooks(BookNode* head) { BookNode* current = head; while (current != NULL) { printf("ID: %s, Name: %s, Price: %.2f\n", current->id, current->name, current->price); current = current->next; } } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值