数据结构与算法C程序(2单链表)
1、包含的头文件
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
2、重定义类型
typedef int ElemType; //元素类型
typedef int Status; //函数返回值类型
3、链表节点结构体
/*链表节点创建*/
typedef struct Node
{
ElemType data; //数据
struct Node *Next; //指针域
} Node,*LinkList;
4、操作函数
链表创建-头插法
/**
* @description: 链表创建函数-头插法
* @param {(LinkList *L)-链表节点头指针,(int n)-链表节点数}
* @return {无}
*/
void CreateListHead(LinkList *L,int n)
{
LinkList p; //链表移动指针
int i;
srand(time(0)); //随机数
*L =(LinkList)malloc(sizeof(Node)); //头节点指针空间开辟
(*L)->Next = NULL;
for(i=0;i<n;i++) //节点插入
{
p = (LinkList)malloc(sizeof(Node));
p->data = rand()%100+1;
p->Next = (*L)->Next;
(*L)->Next = p;
}
}
链表创建-尾插法
/**
* @description:链表创建函数-尾插法
* @param {(ListInsert *L)-链表头指针,(int n)-插入节点数}
* @return {无}
*/
void CreateListLast(LinkList *L,int n)
{
LinkList p,r; //插入节点指针和移动指针
int i;
srand(time(0));
*L=(LinkList)malloc(sizeof(Node)); //头指针开辟空间
r = *L;
for(i=0;i<n;i++) //链表创建
{
p = (Node *)malloc(sizeof(Node));
p->data = rand()%100+1;
r->Next = p;
r = p;
}
}
节点插入
/**
* @description: 链表节点插入函数
* @param {(LinkList *L)-链表头指针,(int i)-链表插入节点的位数,(int e)-插入的数据}
* @return {成功返回:1,失败返回:0}
*/
Status ListInsert(LinkList *L,int i,int e)
{
int j=1;
LinkList p,s; //p为移动指针,s为插入节点
p = *L;
while(p&&j<i) //寻找插入点
{
p = p->Next;
j++;
}
if(!p||j>i) //判断插入点是否合理
{
return 0; //不合理返回0
}
s = (LinkList)malloc(sizeof(Node)); //插入节点开辟空间
s->data = e; //插入节点获取数据
s->Next = p->Next; //节点指针插入
p->Next = s;
return 1; //插入成功返回0
}
节点删除
/**
* @description: 链表节点删除
* @param {(LinkList *L)-链表头指针,(int n)-删除节点的位置}
* @return {成功返回:1,失败返回:0}
*/
Status ListDelete(LinkList *L,int n)
{
LinkList p,q; //移动指针与节点指针
int j=1;
p = *L;
while(p->Next && j<n) //寻找删除点
{
p=p->Next;
++j;
}
if(!(p->Next)||j>n)
{
return 0; //不合理返回0
}
q = p->Next;
p->Next = q->Next;
free(q);
return 1;
}
链表删除
/**
* @description: 链表删除
* @param {(LinkList *L)-链表头指针}
* @return {无}
*/
void ClearList(LinkList *L)
{
LinkList p,q; //移动指针
p = *L;
while(p)
{
q = p->Next;
free(p);
p = q;
}
}
5、主函数测试
/**
* @description:主函数
* @param {无}
* @return {无}
*/
void main()
{
int i,j,n=10;
Node *p,*s; //节点头指针和移动指针
//CreateListHead(&p,10);
CreateListLast(&p,10);
s=p;
for(i=0;i<=10;i++)
{
printf("表中序号%d的数据是%d\n",i,s->data);
s = s->Next;
}
j = ListDelete(&p,10);
if(j == 1)
{
s=p;
for(i=0;i<=10;i++)
{
printf("表中序号%d的数据是%d\n",i,s->data);
s = s->Next;
}
}
else
printf("失败!");
ClearList(&p);
}
6、测试结果