您的位置:首页 > 其它

带有头指针的链表的 创建 输出 查找 删除 释放 排序(冒泡排序)功能实现(尾插法(自动记录最后一个节点))

2018-02-24 20:10 691 查看
#include<stdio.h>
#include<stdlib.h>

typedef struct stu
{ //此链表使用尾插法

char name[20];
int number;
int achieve;
struct stu *next;
}STU;

typedef struct _list
{
STU* head;
STU* last;
}LIST;

void add(LIST* phead,int ch);    //创建并输入节点
void print(STU *head); //输出链表
STU *search(STU *head,int ch); //查找节点
void prin(STU *point); //输出节点
void fre(STU** head);    //删除节点
void  del(STU * head,int ch); //释放链表
STU *rank(STU * head);              //链表排序

void add(LIST* phead,int ch)

STU *p=(STU*)malloc(sizeof(STU));
p->achieve=ch;
p->next=NULL;
/*STU *last=phead->head;
if(last)
{      
while(last->next)
{
last=last->next;
}
last->next=p;
}
else
{
phead->head=p;
}*/ //注释掉的部分 是遍历链表找到最后一个节点
if(phead->head)
{                                                 //使用 LIST list->last 可在每一遍输入中定位最后一个节点
phead->last->next=p; //也可在函数中使用 static last存储最后一个节点
}
else
{              
phead->head=p;
}
phead->last=p;

}

void print(STU *head)
{
STU *p;
int count=1;
p=head;
while(p)
{
printf("第%d个:",count);
printf("%d\n",p->achieve);
p=p->next;
count++;
}

}

STU *search(STU *head,int ch)
{
STU *point;
point=head;
while(point!=NULL)
{
if(point->achieve==ch)
{
break;
}
point=point->next;
}
return point;
}

void prin(STU *point)
{
printf("%d\n",point->achieve);
}

void fre(STU** head)
{
STU *temp;
while(*head!=NULL)
{
temp=*head;
*head=(*head)->next;
free(temp);
}
}

void  del(STU ** head,int ch)
{
STU *p,*q;
q=NULL;
p=*head;
for(;p!=NULL;q=p,p=p->next)
{
if(p->achieve==ch)
{
if(q!=NULL)
{
q->next=p->next;
}
else
{
*head=p->next;
}

free(p);
break;
}
}
}

STU *rank(STU * head)
{
STU *p,*q;
for(p = head; p != NULL; p = p -> next)
for(q = p->next; q != NULL; q = q -> next)
if((p->achieve)>(q ->achieve))
{
int s = q->achieve;
q->achieve=p->achieve;
p->achieve=s;
}
return head;
}
int main()
{
LIST list;
list.head=NULL;
int ch;
printf("请输入数据(输入值为-1时结束输入)\n");
do                             //创建并输入节点
{
scanf("%d",&ch);
if(ch!=-1)
{
add(&list,ch);
}
}while(ch!=-1);
printf("输出链表\n");
print(list.head); //输出链表
printf("输入要搜索的数据\n");
scanf("%d",&ch); //查找节点
STU *retur;
retur=search(list.head,ch);    
if(retur==NULL)
{
printf("没找到\n");
}
else
{
do
{
printf("找到\n");
prin(retur);              //输出找到的节点
}while((retur=search(retur->next,ch))!=NULL);
}
printf("输入想要删除的数据\n");
scanf("%d",&ch);  //删除节点
del(&(list.head),ch);
printf("输出删除节点后的链表\n");
print(list.head);//输出链表
printf("输出排序后的链表\n");
print(rank(list.head)); //排序并输出链表
printf("释放链表\n");
fre(&(list.head));            //释放链表
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐