// 基础版 链表的建立、遍历、增、删、排序、判断是否为空、求长度
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
//定义一个结构体类型及其别名
typedef struct Node
{
int data;
struct Node* pNext; //定义一个能指向结构体类型变量的指针
}NODE,* PNODE; //这里 NODE相当于 struct Node ,PNODE 相当于 struct Node *;
//函数声明 ,最后需要加分号
PNODE create_list(void); //定义了一个创建链表的函数
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 pHead, int post, int *val); //定义了一个能删除结点的函数
void sort_list (PNODE pHead); //定义了一个能为链表排序的函数
int main() //定义主函数
{
int pos1,val1,pos2;
int val2;
PNODE pHead=NULL; //相当于 struct Node pHead=NULL
pHead=create_list(); //创建链表
traverse_list(pHead); //遍历链表
printf("请输入您要增添链表的位置和值:",pos1,val1);
scanf("%d%d",&pos1,&val1);
insert_list (pHead,pos1,val1);
printf("您增添后的链表为:\n");
traverse_list(pHead); //遍历链表
printf("请输入您要删除链表的位置和该位置的值:");
scanf("%d%d",&pos2,&val2);
if( delete_list (pHead,pos2,&val2))
{
printf("删除成功,您删除的元素是:%d\n",val2);
printf("您删除后的链表为:\n");
traverse_list(pHead);
}
else
{
printf("未删除成功,请重试\n");
}
return 0;
}
PNODE create_list(void) //创建链表
{
int len;//记录链表的长度
int i;
int val;//记录于存放链表中的数据
PNODE pHead=(PNODE)malloc(sizeof(NODE));//为头指针分配空间
if(pHead==NULL) //检查是否分配内存
{
printf("分配失败,程序终止\n");
exit(-1);
}
PNODE Tail=pHead; //创建一个尾指针;
Tail->pNext=NULL;
printf("请输入您需要生成链表的结点的个数:len=");
scanf("%d",&len);
for(i=0;i<len;i++)
{
printf("请输入第%d个结点的值:",i+1);
scanf("%d",&val);
PNODE pNew=(PNODE)malloc(sizeof(NODE));
if (pNew==NULL)
{
printf("分配内存失败,程序终止");
exit(-1);
}
pNew->data=val;
Tail->pNext=pNew;
pNew->pNext =NULL;
Tail=pNew;
}
return pHead;
}
void traverse_list(PNODE pHead) //遍历链表
{
PNODE p=pHead->pNext;
while(p!=NULL)
{
printf("%d\t",p->data );
p=p->pNext ;
}
printf("\n");
return;
}
bool is_empty(PNODE pHead) //检查链表是否为空
{
if (NULL==pHead->pNext)
return true;
else
return false;
}
length_list (PNODE pHead) //记录链表的长度
{
PNODE p=pHead->pNext;
int len=0;
while(p!=NULL)
{
len++;
p=p->pNext ;
}
return len;
}
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=0,q=p->pNext ;j<len;j++,q=p->pNext )
{
if (q->data <p->data )
{
t=p->data ;
p->data =q->data ;
q->data =p->data ;
}
}
}
}
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)
{
return false;
}
PNODE pNew=(PNODE)malloc(sizeof(NODE));
if (pNew==NULL)
{
printf("动态分配内存失败!");
exit (-1);
}
pNew->data =val;
PNODE q=p->pNext;
p->pNext=pNew;
pNew->pNext=q;
return true;
}
bool delete_list (PNODE pHead,int pos,int *pval)
{
int i=0;
PNODE p=pHead;
while(p->pNext!=NULL &&i<pos-1)
{
p=p->pNext ;
i++;
}
if (i>pos-1 ||p->pNext==NULL)
return false;
PNODE q=p->pNext ;
*pval=q->data ;
p->pNext =p->pNext ->pNext;
free(q);
q=NULL;
return true;
}
链表的查找、排序、增删、检查
于 2023-12-03 10:15:46 首次发布