在VS2017中,用c语言实现链表的初始化,遍历输出,判断空,计算长度,插入,删除,选择排序
以及关于狭义,广义算法,泛型的理解
#include<stdio.h>
#include<windows.h>
//链表的定义:n个结点离散分配,彼此通过指针相连
//每个节点只有一个前驱节点和一个后续节点
//首节点没有前驱节点,尾节点没有后续节点
/*
狭义的算法是与数据的存储方式密切相关的
广义的算法是与数据的存储方式无关的
泛型:利用某种技术达到的效果就是 不同的存储方式,执行的操作是一样的
*/
typedef struct Node {
int data;//数据域
struct Node * pNext;//指针域
}NODE,*PNODE;//NODE等价于struct Node, PNODE 等价于struct Node *
PNODE create_list();
void traverse_list(PNODE);//遍历链表输出
bool is_empty(PNODE);
int length_list(PNODE);
bool insert_list(PNODE, int, int);
bool delete_list(PNODE, int, int *);
void sort_list(PNODE);
int main()
{
PNODE pHead = NULL;//初始化
int val;
pHead = create_list();//创建一个非循环单链表,并将该链表的头结点的地址赋给pHead
traverse_list(pHead);
if (is_empty(pHead))
printf("链表为空\n");
else
printf("链表不为空\n");
int len = length_list(pHead);
printf("该链表的长度是:%d\n", len);
insert_list(pHead, 3, 33);
traverse_list(pHead);
if (delete_list(pHead, 3, &val))
printf("删除成功,删除的元素是:%d\n", val);
else
printf("删除失败\n");
traverse_list(pHead);
sort_list(pHead);
traverse_list(pHead);
system("pause");
return 0;
}
//返回的是一个地址
PNODE create_list() {
int len;
int i;
int val;
PNODE pHead = (PNODE)malloc(sizeof(NODE));//生成一个不存放数据的头结点
if (NULL == pHead) {
printf("分配失败,程序终止!\n");
exit(-1);
}
PNODE pTail = pHead;
pTail->pNext = NULL;
printf("请输入链表结点的个数:len=");
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 (NULL == pHead) {
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;
while (p != NULL) {
printf("%d ", p->data);
p = p->pNext;
}
printf("\n");
return;
}
bool is_empty(PNODE pHead) {
if (pHead->pNext == NULL)
return true;
else
return false;
}
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)//前者判断输入的pos是否小于1,后者判断是否超出可插入的范围
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 * pVal) {
int i = 0;
PNODE p = pHead;
while (p->pNext != NULL && i < pos-1 ) {//也是找到pos的前一个结点
p = p->pNext;
i++;
}
if (i > pos - 1 || p->pNext == NULL)//前者判断输入的pos是否小于1,后者判断是否超出可删除的范围
return false;
PNODE q;
q = p->pNext;
*pVal = q->data;
p->pNext = q->pNext;
//指向原来动态分配的结点
free(q);
q = NULL;
return true;
}
//选择排序
void sort_list(PNODE pHead) {
int i, j, t;
PNODE p, q;
int len = length_list(pHead);
for (i = 0, p = pHead->pNext; i < len - 1; i++,p=p->pNext)
{
for (j = i + 1,q=p->pNext; j < len; j++,q=q->pNext)
{
if (p->data>q->data) {//a[i] > a[j]
t = p->data;
p->data = q->data;
q->data = t;
}
}
}
}