插入算法和删除演示:
#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 pHead);
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);
sort_list(pHead); //选择排序
traverse_list(pHead); //遍历输出
*/
insert_list(pHead, 4, 33);
traverse_list(pHead);//遍历输出
int val;
if (delete_list(pHead, 4, &val)) {
printf("删除成功,删除的元素%d:\n",val);
}else {
printf("删除失败,删除的元素不存在%d:\n",val);
}
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;
}
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;
}
//排序算法
void sort_arr(pNode pHead) {
int i, j, tmp;
int arr[6] = { 5,8,45,2,9,3 };
int len=length_list(pHead); //获取链表长度
pNode p, q;
for (i = 0; i < len-1; i++){
for (j = i+1; j < len; j++){
}
}
}
//选择排序 从小到大排
void sort_list(pNode pHead){
int i,j,t;
int len = length_list(pHead); //获取链表长度
pNode p,q;
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; //类似于数组中的: t = a[i];
p->data = q->data; //类似于数组中的: a[i] = a[j];
q->data = t; // 类似于数组中的: a[j] = t;
}
}
}
}
//在pHead所指向链表的第pos个节点的前面插入-一个新的结点,该节点的值是val,并 且pos的值是从1开始
bool insert_list(pNode pHead, int pos, int val) {
int i = 0;
pNode p = pHead;
while (NULL != p && i < pos - 1) {
p = p->pNext;
++i;
}
if (i > pos - 1 || NULL == p) {
return false;
}
pNode pNew = (pNode)malloc(sizeof(Node));
if(NULL == pNew){
printf("动态分配内存失败!");
exit(-1);
}
pNew->data = val;
//定义一个临时节点,数据交换存储
pNode tmp = p->pNext;
p->pNext=pNew;
pNew->pNext = tmp;
return true;
}
bool delete_list(pNode pHead, int pos, int * val) {
int i = 0;
pNode p = pHead;
while (NULL != p->pNext && i < pos - 1) {
p = p->pNext;
++i;
}
if (i > pos - 1 || NULL == p->pNext) {
return false;
}
pNode tmp=p->pNext; //将需要删除的节点临时保存起来
*val = tmp->data;
p->pNext = p->pNext->pNext; //删除p节点后一个节点
free(tmp);
tmp = NULL;
return true;
}