64,654
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef struct sl_node
{
int data;
struct sl_node * next;
}sl_node_t;
typedef sl_node_t * sl_list_t; // sl_list_t 是(sl_not_t *)的别名
//*******************************************************
//** sl_list_add: 向单链表的尾部添加数据,返回值为新的尾部指针
//** last == 当前链表的尾部指针, data == 添加的数据
sl_node_t * sl_list_add(sl_node_t * last, int data)
{
sl_node_t * node = (sl_node_t *)malloc(sizeof(sl_node_t));
assert(NULL != node);
node->data = data;
node->next = NULL;
if(NULL != last) last->next = node;
return node;
}
//*******************************************************
//** sl_list_add: 翻转单链表,并将新的表头指针写回到 dst 参数中
//** 返回值:也可以直接将新表头通过返回值返回(这样就无须 * dst 参数)
sl_list_t sl_list_reverse(sl_list_t src, sl_list_t *dst)
{
sl_node_t * prev = NULL;
sl_node_t * curr = src;
sl_node_t * next;
while(curr)
{
next = curr->next; // 先获取下一个指针
curr->next = prev; // 反转指针指向
if(NULL == next) break; // 如果已经处理到了链表结尾,则结束
prev = curr;
curr = next;
}
if(NULL != dst) * dst = curr; // 将新的表头指针写入到dst
return curr;
}
//*******************************************************
//** sl_list_destroy: 释放链表所分配的内存
void sl_list_destroy(sl_list_t sl)
{
sl_node_t * next = sl;
while(next)
{
sl = next;
next = next->next;
free(sl);
}
}
int main(int argc, char **argv)
{
#define ITEMS_COUNT (20)
int i = 0;
sl_node_t * last;
sl_list_t sl = sl_list_add(NULL, i); // 保存第一次添加时所返回的指针,该指针即为表头指针
printf("sl = %p\n", sl);
last = sl; // 当前的链表尾部指针 == 表头指针
// 向链表中添加些数据
for(i = 1; i < ITEMS_COUNT; ++i)
{
last = sl_list_add(last, i);
}
// 显示当前链表内容
last = sl; // 从表头开始显示
while(last)
{
printf("%3d ", last->data);
last = last->next;
}
printf("\n");
// 反转链表
sl = sl_list_reverse(sl, &last);
// 显示当前链表内容
while(last)
{
printf("%3d ", last->data);
last = last->next;
}
printf("\n");
// 释放内存(用C编程时,必须养成这种习惯)
sl_list_destroy(sl);
#undef ITEMS_COUNT
return 0;
}
[/quote]
嗯嗯,学习了(内容少于十个字不能发送?)
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef struct sl_node
{
int data;
struct sl_node * next;
}sl_node_t;
typedef sl_node_t * sl_list_t; // sl_list_t 是(sl_not_t *)的别名
//*******************************************************
//** sl_list_add: 向单链表的尾部添加数据,返回值为新的尾部指针
//** last == 当前链表的尾部指针, data == 添加的数据
sl_node_t * sl_list_add(sl_node_t * last, int data)
{
sl_node_t * node = (sl_node_t *)malloc(sizeof(sl_node_t));
assert(NULL != node);
node->data = data;
node->next = NULL;
if(NULL != last) last->next = node;
return node;
}
//*******************************************************
//** sl_list_add: 翻转单链表,并将新的表头指针写回到 dst 参数中
//** 返回值:也可以直接将新表头通过返回值返回(这样就无须 * dst 参数)
sl_list_t sl_list_reverse(sl_list_t src, sl_list_t *dst)
{
sl_node_t * prev = NULL;
sl_node_t * curr = src;
sl_node_t * next;
while(curr)
{
next = curr->next; // 先获取下一个指针
curr->next = prev; // 反转指针指向
if(NULL == next) break; // 如果已经处理到了链表结尾,则结束
prev = curr;
curr = next;
}
if(NULL != dst) * dst = curr; // 将新的表头指针写入到dst
return curr;
}
//*******************************************************
//** sl_list_destroy: 释放链表所分配的内存
void sl_list_destroy(sl_list_t sl)
{
sl_node_t * next = sl;
while(next)
{
sl = next;
next = next->next;
free(sl);
}
}
int main(int argc, char **argv)
{
#define ITEMS_COUNT (20)
int i = 0;
sl_node_t * last;
sl_list_t sl = sl_list_add(NULL, i); // 保存第一次添加时所返回的指针,该指针即为表头指针
printf("sl = %p\n", sl);
last = sl; // 当前的链表尾部指针 == 表头指针
// 向链表中添加些数据
for(i = 1; i < ITEMS_COUNT; ++i)
{
last = sl_list_add(last, i);
}
// 显示当前链表内容
last = sl; // 从表头开始显示
while(last)
{
printf("%3d ", last->data);
last = last->next;
}
printf("\n");
// 反转链表
sl = sl_list_reverse(sl, &last);
// 显示当前链表内容
while(last)
{
printf("%3d ", last->data);
last = last->next;
}
printf("\n");
// 释放内存(用C编程时,必须养成这种习惯)
sl_list_destroy(sl);
#undef ITEMS_COUNT
return 0;
}