#include <stdio.h>
#include <malloc.h>
typedef struct SNode
{
// 数据域
int data;
// 指针域
struct SNode *next;
} * PNode, Node;
// PNode=struct SNode* Node=struct SNode
// 初始化一个链表
PNode init_list();
// 插入元素
bool insert(PNode, int, int);
// 删除结点
bool delete_node(PNode, int, int *);
// 获得链表的长度
int get_length(PNode);
// 判断链表是否为空
bool is_empty(PNode);
// 对链表进行排序
void sort_list(PNode);
// 输出链表
void show_list(PNode);
//销毁链表 把头指针及后续结点全部干掉
void destory_list(PNode *);
int main()
{
PNode list = init_list();
printf("链表初始化结束:\n");
show_list(list);
printf("排序(升序):");
sort_list(list);
show_list(list);
printf("链表的长度是%d:\n", get_length(list));
printf("插入测试元素:");
insert(list, 1, 1);
insert(list, 4, 4);
insert(list, 1, 3);
show_list(list);
printf("删除链表中第三个结点:");
int val;
delete_node(list, 3, &val);
printf("删除的元素是%d\n", val);
show_list(list);
destory_list(&list);
printf("销毁链表==>");
show_list(list);
return 0;
}
PNode init_list()
{
//链表的长度
int length;
//链表结点的值
int val;
//头指针指向头结点
PNode pHead = (PNode)malloc(sizeof(PNode));
if (NULL == pHead)
{
printf("链表初始化失败!");
}
//初始化头结点
pHead->next = NULL;
pHead->data = 0;
//创建指长度的链表
printf("请输入要生成的链表的长度:");
scanf("%d", &length);
//此时尾结点就是头结点
PNode pTail = pHead;
for (int i = 0; i < length; i++)
{
printf("请输入第%d个结点的值:", i + 1);
scanf("%d", &val);
//新生成的结点 每生成一个结点 挂在链表的最后
PNode pNew = (PNode)malloc(sizeof(SNode));
//给新生成的结点数据域赋值
pNew->data = val;
pNew->next = NULL;
//挂在链表的末尾
pTail->next = pNew;
//更新尾结点的位置
pTail = pNew;
}
return pHead;
}
bool is_empty(PNode pHead)
{
if (NULL != pHead)
{
printf("链表不存在!");
}
return NULL == pHead->next;
}
/**
* @param pHead 链表
* @param pos 插入位置
* @param val 要插入的值 可以追加在链表的最后
*/
bool insert(PNode pHead, int pos, int val)
{
int i = 0;
PNode p = pHead;
// 寻找插入位置 找到插入位置的前一个结点
while (p != NULL && i < pos - 1)
{
p = p->next;
i++;
}
// 检查插入位置是否合法
if (p != NULL && i < pos - 1)
{
return false;
}
// 创建新的结点
PNode pNew = (PNode)malloc(sizeof(Node));
pNew->data = val;
pNew->next = p->next;
p->next = pNew;
return true;
}
bool delete_node(PNode pHead, int pos, int *val)
{
int i = 0;
PNode p = pHead;
while (p != NULL && i < pos - 1)
{
p = p->next;
i++;
}
if (NULL == p || i > pos - 1)
{
return false;
}
// 搞一个中间变量暂时保存要删除的结点 要不然删完就找不到它了
PNode pTemp = p->next;
//储存删除的结点中的数据
*val = pTemp->data;
p->next = p->next->next;
free(pTemp);
p = NULL;
return true;
}
int get_length(PNode pHead)
{
if (NULL == pHead)
{
return -1;
}
int count = 0;
PNode p = pHead->next;
while (NULL != p)
{
count++;
p = p->next;
}
return count;
}
void sort_list(PNode pHead)
{
PNode p, q;
for (p = pHead->next; p->next != NULL; p = p->next)
{
for (q = p->next; q != NULL; q = q->next)
{
if (p->data > q->data)
{
int temp;
temp = q->data;
q->data = p->data;
p->data = temp;
}
}
}
}
void show_list(PNode pHead)
{
if (NULL == pHead)
{
printf("链表不存在!");
return;
}
PNode p = pHead->next;
if (NULL != p)
{
while (NULL != p)
{
printf("%d\t", p->data);
p = p->next;
}
printf("\n");
}
else
{
printf("链表为空!");
}
}
void destory_list(PNode *pHead)
{
PNode p, pTemp;
p = *pHead;
while (p)
{
pTemp = p->next;
free(p);
p = pTemp;
}
*pHead = NULL;
}
C++实现单链表(初始化指定长度的单链表)
最新推荐文章于 2024-04-19 23:54:07 发布