#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <stdlib.h>
typedef struct Node {
int data; //数据域
struct Node * pNext; //指针域
}Node, *pNode;
//函数声明
pNode create_list();
void traverse_list(pNode pHead);
int main(void) {
pNode pHead = NULL; //等价于 struct Node *pHead=NULL
pHead = create_list(); //create_list()创建一个非循环单链表,并将该链表的头结点的地址赋给pHead
traverse_list(pHead);
while(true){}
return 0;
}
//创建单链表
pNode create_list() {
int len; //用来存放有效节点数
int i;
int val; //存放用户临时输入的节点数据
//我们首先要先生成一个头结点 不存放有效数据
pNode pHead = (pNode)malloc(sizeof(Node));
if (NULL == pHead) {
printf("内存分配失败");
//程序退出
exit(-1);
}
pNode pTail = pHead; //pTail也指向了头结点
pTail->pNext = NULL;
printf("请输入你要输入节点的个数 len =");
scanf_s("%d", &len);
//假设输入的长度5,我们需要循环
for ( i = 0; i < len; i++){
printf("请输入第%d个节点的值:", i + 1);
scanf_s("%d", &val);
pNode pNew=(pNode)malloc(sizeof(Node));
if (NULL == pNew) {
printf("内存分配失败");
//程序退出
exit(-1);
}
pNew->data = val;
//pHead->pNext = pNew;
//pNew->pNext = NULL;
pTail->pNext = pNew; //将这个新节点挂到尾节点,新节点最后一个节点
pNew->pNext = NULL; //将最后一个节点的指针域置空
pTail = pNew; //将新节点赋给最后的一个节点 pTail
}
return pHead;
}
//遍历
void traverse_list(pNode pHead) {
pNode p = pHead->pNext;
while (p!=NULL){
printf("%d ",p->data);
p = p->pNext;
}
//换行
printf("\n");
return;
}
求一个链表的长度和判断一个链表是否为空
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <stdlib.h>
typedef struct Node {
int data; //数据域
struct Node * pNext; //指针域
}Node, *pNode;
//函数声明
pNode create_list();
void traverse_list(pNode pHead);
bool is_empty(pNode pHead); //判断链表是否为空
int length_list(pNode pHead); //链表的长度
bool insert_list(pNode, int, int); //插入 第一个参数表示插入的链表 第二个参数表示插入的位置 第三个参数表示插入的元素
bool delete_list(pNode, int, int *); //第一个参数表示要删除的位置,第二个参数表示要删除的位置 第三参数表示删除的元素的地址放入指针
void sort_list(pNode);
int main(void) {
pNode pHead = NULL; //等价于 struct Node *pHead=NULL
pHead = create_list(); //create_list()创建一个非循环单链表,并将该链表的头结点的地址赋给pHead
traverse_list(pHead);
int len = length_list(pHead);
printf("链表的长度%d\n", len);
while(true){}
return 0;
}
//创建单链表
pNode create_list() {
int len; //用来存放有效节点数
int i;
int val; //存放用户临时输入的节点数据
//我们首先要先生成一个头结点 不存放有效数据
pNode pHead = (pNode)malloc(sizeof(Node));
if (NULL == pHead) {
printf("内存分配失败");
//程序退出
exit(-1);
}
pNode pTail = pHead; //pTail也指向了头结点
pTail->pNext = NULL;
printf("请输入你要输入节点的个数 len =");
scanf_s("%d", &len);
//假设输入的长度5,我们需要循环
for ( i = 0; i < len; i++){
printf("请输入第%d个节点的值:", i + 1);
scanf_s("%d", &val);
pNode pNew=(pNode)malloc(sizeof(Node));
if (NULL == pNew) {
printf("内存分配失败");
//程序退出
exit(-1);
}
pNew->data = val;
//pHead->pNext = pNew;
//pNew->pNext = NULL;
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 (NULL == pHead->pNext) {
return true;
}else {
return false;
}
}
//求一个链表的长度
int length_list(pNode pHead) {
pNode p=pHead->pNext; //第一个节点
int len = 0;
while (NULL != p) { //只要指针指向的下一个元素不是空,指针就继续向后移动
++len;
p=p->pNext;
}
return len;
}
算法:
狭义的算法是与数据的存数方式密切相关
广义的算法是与数据的存储方式无关
泛型:
利用某种技术达到的效果就是:不同的存数方式,执行的操作是一样的