# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>
//线性链表模拟
/*
只是单纯的模拟练习一下,没有检查健壮性,这可能是一个漏洞百出的程序。
*/
typedef struct Node
{
int data;
struct Node * pNode;
}NODE,* PNODE;
PNODE create_list(int/*链表的长度,链表的值默认为0*/);//创建一个链表
void show_list(PNODE/*链表头指针地址*/);//遍历一个链表并打印输出
bool is_empty(PNODE/*链表头指针地址*/);//判断链表是否为空
bool insert_val(PNODE/*链表头指针地址*/,int/*值*/);//给链表赋值
int len_list(PNODE/*链表头指针地址*/);//判断链表的长度
bool del_val(PNODE/*链表头指针地址*/,int/*要删除的值*/,int * /*将删除的值返回给此地址指向的变量*/);//删除某一个值
void sort_list(PNODE/*链表头指针地址*/);//链表排序
void sort_list2(PNODE/*链表头指针地址*/);//链表排序2
bool expand_list(PNODE/*链表头指针地址*/,int/*索引位置*/,int/*要插入的值*/);//在链表的指定位置扩充一个链表元素。
int get_val(PNODE/*链表头指针地址*/,int/*索引位置*/);//获取特定索引位置的链表的值。
int main(void)//测试链表
{
int pval = NULL;
PNODE p = create_list(6);
insert_val(p,35);
insert_val(p,22);
insert_val(p,67);
insert_val(p,89);
insert_val(p,65);
insert_val(p,90);
expand_list(p,6,11);
//sort_list2(p);
show_list(p);
printf("长度:%d\n",len_list(p));
printf("%d\n",get_val(p,2));
return 0;
}
PNODE create_list(int len)//创建一个链表
{
PNODE pn = NULL;
PNODE pt = NULL;
int i;
pn = (PNODE)malloc(sizeof(NODE));
pt = pn;
for(i=0;i<len;i++)
{
pt->pNode = (PNODE)malloc(sizeof(NODE));
pt = pt->pNode;
pt->data = NULL;
pt->pNode = NULL;
}
return pn;
}
void show_list(PNODE Pnode)//遍历一个链表并打印输出
{
PNODE t;
t = Pnode->pNode;
while(NULL != t)
{
printf("%d\n",t->data);
t = t->pNode;
}
}
bool is_empty(PNODE pn)//判断链表是否为空
{
if(NULL == pn || NULL == pn->pNode) return true;
return false;
}
int len_list(PNODE pn)//判断链表的长度
{
int cnt=0;
pn = pn->pNode;
while(NULL!=pn)
{
cnt++;
pn = pn->pNode;
}
return cnt;
}
bool insert_val(PNODE pn,int val)//给链表赋值
{
int len = len_list(pn);
pn = pn->pNode;
if(pn->data==NULL)
{
pn->data = val;
return true;
}
else
{
int i = 0;
while(NULL != pn->data && NULL != pn->pNode)
{
i++;
pn = pn->pNode;
}
if(NULL == pn->data)
{
pn->data = val;
return true;
}
}
return false;
}
bool del_val(PNODE pn,int val,int * pdel_val)//删除某一个值
{
PNODE pt = pn;
pn = pn->pNode;
while(NULL!=pn->data&&NULL!=pn->pNode)
{
if(pn->data==val)
{
*pdel_val = pn->data;
break;
}
pt = pn;
pn = pn->pNode;
}
if(pn->pNode==NULL&& *pdel_val == NULL) return false;
pt->pNode = pn->pNode;
free(pn);
return true;
}
void sort_list(PNODE pn)//链表排序
{
int temp;
PNODE pt = NULL;
pn = pn->pNode;
pt = pn->pNode;
while(pn->pNode!=NULL&&pn->pNode->pNode!=NULL)
{
pt = pn->pNode;
while(pt->pNode!=NULL)
{
if(pn->data>pt->data)
{
temp = pn->data;
pn->data = pt->data;
pt->data = temp;
}
pt = pt->pNode;
}
pn = pn->pNode;
}
}
void sort_list2(PNODE pn)//链表排序2
{
PNODE p1 = NULL,p2=NULL;
int pt;
for(p1 = pn->pNode;p1->pNode!=NULL;p1=p1->pNode)
{
for(p2=p1->pNode;p2->pNode!=NULL&&p2!=NULL;p2=p2->pNode)
{
if(p1->data>p2->data)
{
pt=p1->data;
p1->data=p2->data;
p2->data=pt;
}
}
}
}
bool expand_list(PNODE pn,int index,int val)//在链表的指定位置扩充一个链表元素。
{
int i = 1;
PNODE p1 = pn;
if(index>0&&index<=len_list(pn))
{
for(p1 = pn->pNode;i<index&&p1!=NULL;p1=p1->pNode,pn=pn->pNode) i++;
pn->pNode = (PNODE)malloc(sizeof(NODE));
pn->pNode->data = val;
pn->pNode->pNode = p1;
return true;
}
return false;
}
int get_val(PNODE pn,int index)//获取特定索引位置的链表的值。
{
int i = 1;
PNODE p1 = pn;
if(index>0&&index<=len_list(pn))
{
for(p1 = pn->pNode;i<index&&p1!=NULL;p1=p1->pNode,pn=pn->pNode) i++;
return p1->data;
}
printf("没有找到指定的值。\n");
return 0;
}
06-18
635