带有头指针的链表的 创建 输出 查找 删除 释放 排序(冒泡排序)功能实现(尾插法(自动记录最后一个节点))
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;
}
#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;
}
相关文章推荐
- 链表的基本操作(创建,查找指定位置元素,删除指定元素,插入,倒置,去重,求集合的差,分别交换结点与交换结点值实现的冒泡排序,将两个有序链表合并成一个有序链表)c语言实现
- java实现单链表的初始化,创建,删除,插入,查找,排序,同项删除,退出等功能
- 两种方法实现单向链表的创建、遍历、删除、查找、逆序输出(循环法和递归法)
- 二叉查找树带父节点指针的创建,销毁,查找,删除,插入,找前驱后继,找最小值最大值(递归和非递归的实现)
- java实现创建链表以及插入节点,查找结点,删除节点等操作
- C++链表的创建、插入、删除、查找、合并、排序、修改等操作的实现
- 实现链表的逆序输出和删除某节点
- python 学习记录(11)-文件处理/读取文件/文件写入内容/文件删除/文件复制/文件重命名/后缀名/内容查找与替换/文件比较/ 配置文件访问/目录创建与删除/遍历目录/定向输出
- 使用Ext中的Grid,Form,Dialog来实现列表,创建,更新,删除,查找和分页功能
- 设计一个整型链表类list,能够实现链表节点的插入、删除、以及链表数据的输出操作。
- C语言:动态链表的建立,查找,删除,插入功能的实现
- 这是一个关于XML文档的操作管理器XMLHelper类,类中包括XML文档的创建,文档节点和属性的读取,添加,修改,删除的方法功能的实现
- C语言实现带头结点的链表的创建、查找、插入、删除操作
- 利用模板类编写一个程序,实现双向链表的插入、删除、查找、显示的功能。
- 建立一个带附加头结点的单链表.实现测长/打印/删除结点/插入结点/逆置/查找中间节点/查找倒数第k个节点/判断是否有环
- 单链表的创建(头插尾插),表长,输出,插入,删除,查找,逆置,分解长两个链表(奇数偶数链表),查找倒数第k个元素,产出相同元素
- 链表操作:创建,插入,删除,查找等功能
- 二叉排序树,完成创建节点,插入节点,删除节点,查找节点,中序遍历的功能
- 实现单链表创建、插入、删除、打印功能
- C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)