C语言实现数据结构的链表
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
// 定义链表的结构体
typedef struct Node
{
int data;
struct Node *pNext;
} NODE, *PNODE;
PNODE creat_list(void);
bool empty_list(PNODE);
void show_list(PNODE);
bool insert_list(PNODE, int, int);
bool del_list(PNODE, int, int* );
int main(void)
{
PNODE pHead = creat_list();
int val;
show_list(pHead);
insert_list(pHead,2,66);
// if(del_list(pHead,2,&val))
// {
// printf("删除成功!为:%d\n",val);
// }
// else
// {
// printf("失败!");
// }
show_list(pHead);
return 0;
}
// 创建一个链表
PNODE creat_list(void)
{
// 创建一个头节点方便链表的操作,这个节点并不保存实际数据
PNODE pHead = (PNODE)malloc(sizeof(NODE));
if (NULL == pHead)
{
printf("动态构建节点出错!\n");
// 终止
exit(-1);
}
// 构建一个一直指向最后一个节点的指针,方便对链表的添加
PNODE pEnd = pHead;
pEnd->pNext = NULL;
printf("请输入你需要的节点个数:");
int len = 0;
int i;
scanf("%d", &len);
for (i = 0; i < len; i++)
{
printf("请输入第%d个节点的值:", i + 1);
// 接收用户输入的值
int val;
scanf("%d", &val);
// 构建一个新的节点用来添加至链表末尾
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if (NULL == pNew)
{
printf("动态构建节点出错!\n");
// 终止
exit(-1);
}
// 给节点赋值
pNew->data = val;
// 将这个新的节点移动到链表的末尾处
pEnd->pNext = pNew;
pNew->pNext = NULL;
// 链表所指向的最后一个节点改变,这个新加入的节点就是链表目前最后一个节点
pEnd = pNew;
}
return pHead;
}
// 判空
bool empty_list(PNODE pHead)
{
if (pHead->pNext == NULL)
return true;
else
return false;
}
// 遍历链表
void show_list(PNODE pHead)
{
if (empty_list(pHead))
{
printf("链表为空!");
return;
}
else
{
// 一个临时指针,指向第一个节点,代替pHead进行操作,pHead不能改变
// PNODE p = pHead->pNext;
// PNODE p = pHead;
// while (p != NULL)
// {
// printf(" %d ", p->data);
// p = p->pNext;
// }
// 这个是可行的,但是第一次为什么没有成功?
// 不清楚
PNODE p = pHead;
while (p->pNext != NULL)
{
p = p->pNext;
printf(" %d ", p->data);
}
printf("\n");
}
}
// 指定位置添加节点
bool insert_list(PNODE pHead, int pos, int val)
{
// 同样的代替头文件的操作
PNODE p = pHead;
int i = 0;
while (p != NULL && i < pos - 1)
{
p = p->pNext;
i++;
}
if (i > pos - 1 || p == NULL)
{
return false;
}
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if (NULL == pNew)
{
printf("动态构建节点出错!\n");
// 终止
exit(-1);
}
// 给新节点赋值
pNew->data = val;
// 指定位置插入新节点
pNew->pNext = p->pNext;
p->pNext = pNew;
return true;
}
// 删除指定位置的节点
bool del_list(PNODE pHead, int pos, int* pVal)
{
PNODE p = pHead;
int i = 0;
while(p != NULL && i < pos - 1)
{
p = p ->pNext;
i++;
}
if(p == NULL || i > pos -1)
{
return false;
}
PNODE t = p->pNext;
*pVal = t->data;
p->pNext = t->pNext;
free(t);
t = NULL;
return true;
}