采用了带头节点的链表。
这一段时间对C指针和内存了解了很多,写个链表的基本操作。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct node
{
int data;
struct node *pNext; // 指向下一个节点的指针,指向下一个节点的整体。
};
typedef struct node Node;
Node * create_node(int data)
{
Node *p1 = (Node *)malloc(sizeof(Node)); // 1创建一个节点
if (NULL == p1)
{
printf("malloc err\n");
return NULL;
}
// 2 清理新空间
bzero(p1,sizeof(Node)); // 新节点清0
// 3 填充节点
p1->data = data;
p1->pNext = NULL; // 将来要指向新节点的首地址
return p1;
}
// 尾插
void insert_tail(Node *pH,Node *new)
{
int count = 0;
// 分两步插入
Node *p = pH;
// 1 先找到链表中最后节点
while (NULL != p->pNext)
{
p = p->pNext;
count++;
}
// 2将新节点插入到最后一个节点尾部
p->pNext = new;
pH->data = count + 1;
}
// 头插
void insert_head(Node *pH,Node *new)
{
new->pNext = pH->pNext;
pH->pNext = new;
pH->data += 1;
}
// 先移动和先输出区别:p = p->pNext;先输出不能输出链表最后一个节点。
void traversal(Node *pH)
{
Node *p = pH;
while ( NULL != p->pNext)//
{
// 先移动和先输出区别:p = p->pNext;先输出不能输出链表最后一个节点。
//printf("%d\n",p->data);
//p = p->pNext;
p = p->pNext;
printf("%d\n",p->data);
}
}
// 删除节点:是尾节点和非尾结点
int delete_node(struct node *pH,int data)
{
Node *p = pH;
Node *preP = NULL;
int rt = 0;
while (NULL != p->pNext)
{
preP = p;
p = p->pNext;
if (p->data == data)
{
// 找到的是非尾节点
if (NULL != p->pNext)
{
preP->pNext = p->pNext;
free(p);
}
else
{
preP->pNext = NULL;
free(p);
}
return 0;
// 找到的尾部节点
}
}
pH->data -= 1;
}
int reverse(Node *pH)
{
Node *p = pH->pNext;
Node *pPre = NULL;
if (pH->pNext == NULL || p == NULL)
{
printf("只有一个节点或者为空\n");
return -1;
}
while (NULL != p->pNext)
{
// 如果是第一个节点,头插后将其置空
pPre = p->pNext;
if (p == pH->pNext)
{
p->pNext = NULL;
p = pPre;
}
else // 非第一个节点,进行前插
{
p->pNext = pH->pNext;
pH->pNext = p;
}
p = pPre;
}
insert_head(pH,p);
}
int main()
{
Node *pHeader = create_node(0); // 创建一个新节点
Node *n1 = create_node(11);
Node *n2 = create_node(12);
Node *n3 = create_node(13);
insert_tail(pHeader,n1);
insert_tail(pHeader,n2);
insert_tail(pHeader,n3);
// 使用PHeader访问链表第一个节点:
traversal(pHeader);
//delete_node(pHeader,12);
//printf("删除后]\n");
//traversal(pHeader);
printf("逆序后\n");
reverse(pHeader);
traversal(pHeader);
return 0;
}