复习单链表
具有删除 插入 排序 历遍。
#include <stdio.h>
#include <stdlib.h>
//
typedef struct Node
{
int data;
struct Node * pnext ;
}NODE,*PNODE;
//
PNODE creat_list();
void traverse (PNODE);
void sort_list(PNODE);
int lenth_list(PNODE phead);
bool delete_list(PNODE phead,int pos);//删除第pos个值
bool insert_list(PNODE phead,int pos,int val);//向第pos后个数插入值为val的数
//
int main()
{
PNODE phead = NULL;
int i=0;
phead=creat_list();//创建链表
i=lenth_list(phead);//计算列表的长度
printf("链表的长度为:%d\n",i);
printf("排序后的链表为: ");
sort_list(phead);//列表排序
traverse(phead);//遍历列表
/*if(delete_list(phead,4))//删除第四个数
printf("删除成功。");
*/
insert_list(phead,4,88);//向的4个值后插入一个88
traverse(phead);
return 0;
}
PNODE creat_list()
{
PNODE phead;
PNODE ptail,pnew;
int val,len;
phead = (PNODE)malloc(sizeof(Node));
if(phead == NULL)
{
printf("分配内存失败。\n");
exit(1);
}
ptail=phead;
ptail->pnext = NULL;
printf("请输入节点的个数:");
scanf("%d",&len);
for(int i=0;i<len;i++)
{
printf("请输入第%d个节点的值:",i+1);
scanf("%d",&val);
pnew = (PNODE)malloc(sizeof(NODE));
if(pnew == NULL)
{
printf("分配内存失败。\n");
exit(1);
}
pnew->data=val;
ptail->pnext = pnew;
pnew->pnext=NULL;
ptail=pnew;
}
return phead;
}
void traverse (PNODE phead)
{
PNODE p;
p=phead->pnext;
while(p != NULL)
{
printf(" %d",p->data);
p=p->pnext;
}
puts("");
}
void sort_list(PNODE phead)
{
int i,j,t;
int len=lenth_list(phead);
PNODE p,q;
//冒泡排序
for(i=0,p=phead->pnext;i<len;i++,p=p->pnext)
{
for(j=i+1,q=p->pnext;j<len;j++,q=q->pnext)
{
if(p->data > q->data)
{
t=p->data;
p->data =q->data;
q->data=t;
}
}
}
}
int lenth_list(PNODE phead)
{
PNODE p;
int count=0;
p=phead->pnext;
while(p != NULL)
{
count++;
p=p->pnext;
}
return count;
}
bool insert_list(PNODE phead,int pos,int val)
{
PNODE p=phead->pnext;
PNODE pnew;
int i=0;
while(p!=NULL && i<pos-1)//重要,将p移到要插入的节点前
{
i++;
p=p->pnext;
}
if(p==NULL || i>pos-1 )
return false;
pnew = (PNODE) malloc(sizeof(NODE));
if(pnew==NULL)
{
printf("分配内存失败。");
exit(1);
}
pnew->data=val;
pnew->pnext=p->pnext;
p->pnext=pnew;
return true;
}
bool delete_list(PNODE phead,int pos)
{
PNODE p=phead;
PNODE pnew;
int i=0;
while(p->pnext != NULL && i<pos-1)
{
i++;
p=p->pnext;
}
if(p->pnext ==NULL || i>pos-1 )
return false;
PNODE q=p->pnext;
p->pnext=p->pnext->pnext;
free(q);
return true;
}