一、
算法
算法:
1.狭义的算法是与数据的存储方式密切相关(即实现的方法)
2.广义的算法是与数据的存储方式无关(实现的目的)
3.泛型:利用某种技术达到的效果就是:不同的存储方式,执行的操作是一样的(利用方法实现目的)
代码实现:
首先需要创建结构体变量,结构体为一个数据类型。
结构体的创建
typedef struct Node//创建一个结构体类型
{
int data;//数据域
struct Node* next;//指针域
}NODE, * PNODE;
//其中 NODE 相当于 struct Node
// PNODE 相当于 struct NOde *
链表的创建
PNODE create_list()
{
int len;//链表成员个数
int i;
int val;//成员数据内容
PNODE pHead = (PNODE)malloc(sizeof(NODE));//创建头指针
if (NULL == pHead)//判断是否头指针创建成功
{
printf("创建链表头结点失败\n");
exit(-1);
}
printf("请输入链表长度 len = ");
scanf("%d", &len);
PNODE pTail = pHead;//生成一个尾结点
pTail->next = NULL;
for (int i = 0; i < len; i++)
{
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if (pNew->next == NULL)
{
printf("分配内存失败\n");
exit(-1);
}
printf("请输入要插入链表的值 val =");
scanf("%d",&val);
pNew->data = val;
pTail->next = pNew;//将新结点挂在尾结点上
pNew->next = NULL;
pTail = pNew;//将新结点变成尾结点
}
return pHead;//将生成的链表的头结点地址返回
}
遍历链表
void traverse_list(PNODE pHead)//链表的遍历
{
PNODE p = pHead->next;//将头指针的指针域赋值给新的结点
while (p != NULL)//当该结点的next域不为空,就一直循环
{
printf("%d ", p->data);//输出数据域
p = p->next;//将下一个结点的指针域赋值到当前指针
}
printf("\n");
return;
}
判断链表是否为空
int is_empty(PNODE pHead) //判断链表是否为空
{
if (NULL == pHead->next)
{
return 0;
}
else
{
return 1;
}
}
判断链表的长度
int list_length(PNODE pHead)
{
int len = 0;
PNODE p = pHead->next;
while (p != NULL)//遍历每一个结点,循环一个长度加一
{
len++;
p = p->next;
}
return len;
}
插入结点
void insert_list(PNODE pHead,int pos,int val)//在链表的指定位置增加指定数字
{
int i = 0;
PNODE p = pHead;//创建新的临时结点
while (p != NULL && i < pos-1)//先循环找到插入点前一个结点
{
p = p->next;
i++;
}
if (p == NULL || i > pos-1)//如果链表为空,或者指定插入点不存在即推出程序
{
return 0;
}
PNODE pNew = (PNODE)malloc(sizeof(NODE));//分配一个新的结点
if (pNew == NULL)//判断分配内存给新的结点是否成功
{
printf("动态内存分配失败\n");
exit (-1);
}
printf("输入新的结点的数据 val = ");
scanf("%d",&val);
pNew->data = val;
//将插入点前的指针域保存在临时的结点q处
PNODE q = p->next;
//将要插入的结点的地址赋值给插入点前的指针域(即完成前一个指针指向新结点)
p->next = pNew;
//将临时保存的指针域赋值给插入的结点的指针域(即完成了插入结点指向插入点后结点)
pNew->next = q;
return 1;
}
链表的删除
//链表的删除与插入有相同之处
int dele_list(PNODE pHead, int pos, int* val)//在链表的指定位置删除数据
{
int i = 0;
PNODE p = pHead;
while (p->next != NULL && i < pos - 1)//先循环找到链表的最后一个
{
p = p->next;
i++;
}
if (p->next == NULL || i > pos - 1)
{
return 0;
}
PNODE qNew = p->next;
*val = qNew->data;
p->next = p->next->next;
free(qNew);//释放删除结点的内存
qNew = NULL;
return 1;
}
链表排序
void sort_list(PNODE pHead)
{
int i, j,t;
PNODE p, q;
//冒泡排序
int len = list_length(pHead);
for (i = 0, p = pHead->next; i < len - 1; i++, p = p->next)
{
for (j = i + 1, q = p->next; j < len; j++, q = q->next)
{
if (p->data > q->data)
{
t = p->data;
p->data = q->data;
q->data = t;
}
}
}
return;
}
代码整合实现
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct Node//创建一个结构体类型
{
int data;//数据域
struct Node* next;
}NODE, * PNODE;
PNODE create_list(void);//创建链表
void traverse_list(PNODE pHead);//遍历链表
int is_empty(PNODE pHead);//判断链表是否为空
int list_length(PNODE pHead);//返回链表的长度
void insert_list(PNODE pHead,int,int);//在链表的指定地方插入数据
void sort_list(PNODE pHead);//链表排序
int dele_list(PNODE pHead, int pos, int* val);//链表删除
int main()
{
PNODE pHead = NULL;//定义头结点指针
int val;
pHead = create_list();
traverse_list(pHead);
if (is_empty(pHead))
{
printf("链表不为空\n");
}
else
{
printf("链表为空\n");
}
printf("链表的长度为 len = %d\n",list_length(pHead));
sort_list(pHead);//链表排序
traverse_list(pHead);
insert_list(pHead, 3, 4);
traverse_list(pHead);
if (dele_list(pHead, 2, &val))
{
printf("删除成功,删除的元素是 val = %d \n",val);
}
else
{
printf("删除失败\n");
}
sort_list(pHead);
traverse_list(pHead);
}
PNODE create_list()
{
int len;//链表成员个数
int i;
int val;//成员数据
PNODE pHead = (PNODE)malloc(sizeof(NODE));//创建头指针
if (NULL == pHead)
{
printf("创建链表头结点失败\n");
exit(-1);
}
printf("请输入链表长度 len = ");
scanf_s("%d", &len);
PNODE pTail = pHead;
pTail->next = NULL;
for (int i = 0; i < len; i++)
{
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if (pNew->next == NULL)
{
printf("分配内存失败\n");
exit(-1);
}
printf("请输入要插入链表的值 val =");
scanf_s("%d",&val);
pNew->data = val;
pTail->next = pNew;
pNew->next = NULL;
pTail = pNew;
}
return pHead;
}
void traverse_list(PNODE pHead)
{
PNODE p = pHead->next;
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
return;
}
int is_empty(PNODE pHead)
{
if (NULL == pHead->next)
{
return 0;
}
else
{
return 1;
}
}
int list_length(PNODE pHead)
{
int len = 0;
PNODE p = pHead->next;
while (p != NULL)
{
len++;
p = p->next;
}
return len;
}
void insert_list(PNODE pHead,int pos,int val)//在链表的指定位置增加指定数字
{
int i=0;
PNODE p = pHead;
while (p != NULL && i < pos-1)//先循环找到链表的最后一个
{
p = p->next;
i++;
}
if (p == NULL || i > pos-1)
{
return 0;
}
PNODE pNew = (PNODE)malloc(sizeof(NODE));//分配一个新的结点
if (pNew == NULL)
{
printf("动态内存分配失败\n");
exit (-1);
}
printf("输入新的结点的数据 val = ");
scanf_s("%d",&val);
pNew->data = val;
PNODE q = p->next;
p->next = pNew;
pNew->next = q;
return 1;
}
int dele_list(PNODE pHead, int pos, int* val)//在链表的指定位置删除数据
{
int i = 0;
PNODE p = pHead;
while (p->next != NULL && i < pos - 1)//先循环找到链表的最后一个
{
p = p->next;
i++;
}
if (p->next == NULL || i > pos - 1)
{
return 0;
}
PNODE qNew = p->next;
*val = qNew->data;
p->next = p->next->next;
free(qNew);
qNew = NULL;
return 1;
}
void sort_list(PNODE pHead)
{
int i, j,t;
PNODE p, q;
int len = list_length(pHead);
for (i = 0, p = pHead->next; i < len - 1; i++, p = p->next)
{
for (j = i + 1, q = p->next; j < len; j++, q = q->next)
{
if (p->data > q->data)
{
t = p->data;
p->data = q->data;
q->data = t;
}
}
}
return;
}