关于链表的功能(排序,添加,删除,判断长度,判断是否为空,遍历)

#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);
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();//创建一个非循环单链表,并将该节点的头结点的地址付给phead
traverse_list(phead); //遍历


if(is_empty(phead))
printf("链表为空!\n");
else
printf("链表不为空\n");
int len=length_list(pnode phead);
printf("链表的长度为%d\n",len);
sort_list(pnode phead);


if(delete_list(phead,4,&val))//用函数保存删除的值,所应用取地址符
printf("delete successfully\n");
else
printf("delete failed\n");
return 0;
}
pnode create_list(void)
{
int len;
int i;
int val;//用来临时存放用户输入的结点的值

//分配了一个不存放有效数据的头结点
pnode phead=(pnode)malloc(sizeof(node))//生成节点本身的数据类型,所以用node,不用pnode
if(NULL==phead)
{
printf("分配失败,程序终止!\n");
exit(-1);
}

pnode ptail=phead;
ptail->pnext=NULL;(防止长度可能是0)
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(NULL==phead)
{
printf("分配失败,程序终止!\n");
exit(-1);
}
pnew->data=val;//把临时储存的数据转到pnew中
ptail->pnext=pnew;
pnew->pnext=NULL;
ptail=pnew;//使ptail从原来的头节点变为等于pnew,相当于位移
}
return phead;
}
void traverse_list(pnode phead)
{
pnode p = phead->pnext;//p指向第一个有效元素
while(NULL!=p)
{
printf("%d",p->data);
p=p->pnext;//相当于p指针向后移
}
printf("\n");
}

bool is_empty(pnode phead)
{
if(NULL=phead->pnext)
return ture;
else
return false;
}

int length_list(pnode phead)
{
pnode p=phead->next;
int len;
while(NULL!=p)
{
len++;
p=p->next;
}
return len;
}

void sort_list(pnode phead)//排序
{
int i,j,t;
int len=length_list(pnode 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->pdata>q->pdata)
t=p->pdata;
p->pdatd=q->pdata;
q->pdata=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("动态内存分配失败\n");
exit(-1);
}
pnew->data=val;
pnode q=p->pnext;
p->pnext=pnew;
pnew->pnext=q;

return ture;

}

bool delete_list(pnode phead,int pos,int *pval)
{
int i=0;
pnode p=phead;
while(NULL!=p->pnext&&i<pos-1)
{
p=p-pnext;
++i;
}
if(i>pos-1||NULL==p->next)
return false;
pnode q=p->pnext;
*pval=q->data;

//删除q节点后面的节点
p->pnext=p->pnext->pnext;//相当于q=p->next->next;改变了q的指向
free(q);
q=NULL;

return ture;

}

猜你喜欢

转载自www.cnblogs.com/mingstatebird/p/12080744.html