链表定义:n 个节点离散分配,彼此之间通过指针相连, 每个节点只有一个前驱节点和一个后驱节点, 首节点没有前驱节点, 尾节点没有后驱节点。
链表的基本操作:
包括: 求长度, 插入数据, 删除数据, 遍历等
下面是代码演示:
# include <stdio.h>
# include <stdlib.h>
typedef struct stu
{
int date;
struct stu * pNext;
}NODE, * PNODE;
PNODE create_list(); // 创建一个链表
void traveral_list(PNODE pHead); // 遍历整个链表
int insert_list(PNODE pHead); // 插入数据
int delete_list(PNODE pHead, int *val); // 删除数据
void length_list(PNODE pHead); // 计算链表长度
int main(void)
{
PNODE pHead; // pHead 用来保存头结点
int val; // val 用来保存删除的元素
pHead = create_list();
traveral_list(pHead);
length_list(pHead);
if (insert_list(pHead))
printf("插入数据成功\n");
traveral_list(pHead);
if (delete_list(pHead, &val))
printf("删除节点成功\n");
traveral_list(pHead);
return 0;
}
PNODE create_list()
{
PNODE pHead = (PNODE)malloc(sizeof(NODE)); // pHead 指向头节点。
int len, i, val; // len 用来表示链表的长度。
printf("请输入您需要的链表长度:len = ");
scanf("%d", &len);
PNODE pTail = pHead; // 建立一个临时指针
pTail->pNext = NULL;
for (i = 0; i < len; i++)
{
printf("请输入你要给第%d个链表的数值:", i+1);
scanf("%d", &val);
PNODE pNew = (PNODE)malloc(sizeof(NODE)); // pNew 指向新建的节点。
pNew->date = val; // 给新建立的节点赋值。
pTail->pNext = pNew; // 使得前一个节点的指针域指向后一个节点。
pTail = pNew; // pTail 也指向新建立的节点。
pTail->pNext = NULL; // 使得新建立的节点的指针域为NULL
}
printf("链表建立成功\n\n");
return pHead;
}
void traveral_list(PNODE pHead)
{
PNODE p = pHead->pNext; // p 指向首节点
printf("开始遍历整个链表\n");
while (NULL != p)
{
printf("%d ", p->date);
p = p->pNext;
}
printf("\n遍历完成\n\n");
return;
}
int insert_list(PNODE pHead)
{
int pos, val;
int i = 0;
PNODE p = pHead; // p 指向头结点。
printf("请输入您要在第n个节点前面增加的数据(中间以空格隔开):\n");
scanf("%d %d", &pos, &val);
while (NULL != p && i < pos - 1)
{
p = p->pNext;
i++;
}
if (i > pos - 1 || p == NULL)
return 0;
PNODE pNew = (PNODE)malloc(sizeof(NODE));
PNODE q = p->pNext; // q 也指向pos个指针。
p->pNext = pNew;
pNew->pNext = q;
pNew->date = val;
return 1;
}
int delete_list(PNODE pHead, int *pVal)
{
int i = 0, pos;
PNODE p = pHead;
printf("请输入您想删除的节点数:pos = ");
scanf("%d", &pos);
while (NULL != p && i < pos - 1)
{
p = p->pNext;
i++;
}
if (i > pos - 1 || p == NULL)
return 0;
PNODE q = p->pNext; // 建立一个临时指针
*pVal = q->date;
p->pNext = p->pNext->pNext;
free(q); // 把删除的节点free掉
q = NULL;
printf("您删除的元素是: %d\n", *pVal); // 输出删除的元素
return 1;
}
void length_list(PNODE pHead)
{
int i = 0;
PNODE p = pHead->pNext;
while (NULL != p)
{
p = p->pNext;
i++;
}
printf("链表的长度为%d\n\n", i);
return;
}运行结果如下图:
本文介绍了一种使用C语言实现链表的方法,并详细展示了如何创建链表、遍历链表、插入数据、删除数据以及计算链表长度等功能。通过具体的代码实例,读者可以更好地理解链表的工作原理。
735

被折叠的 条评论
为什么被折叠?



