已实现的功能:创建新链表,打印链表,求结点数量,插入结点,删除结点。
//linked_list.cpp
#include <stdio.h>
#include <stdlib.h>
//定义链表结点类型并重命名
typedef struct Node{
int data;//数据域,数据类型暂定为int
struct Node* pNext;//指针域
}NODE,* PNODE;//此后struct Node可简写为NODE,struct Node *可简写为PNODE
//声明
PNODE creat_list();
void traverse_list(PNODE pHead);
int length_list(PNODE pHead);
bool insert_list(PNODE pHead, int pos, int val);
bool delete_list(PNODE pHead, int pos);
int main() {
PNODE pHead = NULL;
pHead = creat_list();//创建一个非循环单链表,将头结点地址赋给头指针pHead
traverse_list(pHead);//遍历输出链表每个结点
int len = length_list(pHead);
printf("链表结点数为%d\n", len);
//insert_list(pHead, 6, 66);
delete_list(pHead, 3);
traverse_list(pHead);
return 0;
}
//新建链表函数
PNODE creat_list() {
int len;//有效结点数
int i;
int val;//临时存放用户输入的结点值
//创建头结点
PNODE pHead = (PNODE)malloc(sizeof(NODE));
if (pHead == NULL) {
printf("分配失败,程序终止!");
exit(-1);
}
//创建尾结点
PNODE pTail = pHead;
pTail->pNext = NULL;//这一步有必要吗?有必要,这里修改的是尾结点的指针域,没毛病.改写成pHead->pNext = NULL也行.
//采集用户需求
printf("请输入你需要生成的结点数:");
scanf_s("%d", &len);
//分别创建每个结点
for (i = 0; i < len; ++i) {
printf("请输入第%d个结点的值:", i + 1);
scanf_s("%d", &val);
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if (pNew == NULL) {
printf("分配失败,程序终止!\n");
exit(-1);
}
pNew->data = val;
pTail->pNext = pNew;
pNew->pNext = NULL;
pTail = pNew;
}
return pHead;
}
//遍历输出整个链表函数
void traverse_list(PNODE pHead) {
PNODE p = pHead->pNext;//p=头结点的指针域,即首结点的地址
while (p != NULL) {
printf("%d ", p->data);
p = p->pNext;
}
printf("\n");
}
int length_list(PNODE pHead) {
PNODE p = pHead->pNext;
int len = 0;
while (p != NULL) {
++len;
p = p->pNext;
}
return len;
}
bool insert_list(PNODE pHead, int pos, int val) {
int i = 0;
PNODE p = pHead;
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 (pNew == NULL) {
printf("动态内存分配失败!\n");
exit(-1);
}
pNew->data = val;
pNew->pNext = p->pNext;
p->pNext = pNew;
return true;
}
bool delete_list(PNODE pHead, int pos) {
int i = 0;
PNODE p = pHead;
while (p->pNext != NULL && i < pos - 1) {
p = p->pNext;
++i;
}
if (i > pos - 1 || p->pNext == NULL) {
return false;
}
PNODE q = p->pNext;
p->pNext = p->pNext->pNext;
free(q);
q = NULL;
return true;
}
本文代码运行环境为Visual Studio Community 2019 16.4.6版本。
代码内容主要来自郝斌老师的课程https://www.bilibili.com/video/av6159200
如有疑问或建议,欢迎留言讨论。