结构和指针单链表部分.docx
- 文档编号:16060648
- 上传时间:2023-07-10
- 格式:DOCX
- 页数:18
- 大小:16.95KB
结构和指针单链表部分.docx
《结构和指针单链表部分.docx》由会员分享,可在线阅读,更多相关《结构和指针单链表部分.docx(18页珍藏版)》请在冰点文库上搜索。
结构和指针单链表部分
结构和指针——单链表部分
关于单链表的基本操作,包括创建一单链表、查看链表、插入新结点、删除结点、链表逆转以及链表排序。
包括两个文件:
*******List.h********
/*
**头文件List.h
*/
#ifndefLIST_H/*防止头文件重复定义*/
#defineLIST_H
/****************/
/*宏定义*/
/****************/
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
#defineOVERFLOW-2
typedefstructNODE{
structNODE*next;
intvalue;
}Node;
/*
**函数的类型定义
*/
typedefintStatus;
#endif/*LIST_H*/
/***********************EndOfFile**************************/
*******List.cpp********
/*
**关于单链表的基本操作,包括创建一单链表、查看链表、插入新结点、
**删除结点、链表逆转以及链表排序。
*/
/****************/
/*头文件包含*/
/****************/
#include
#include
#include"List.h"
/****************/
/*宏定义*/
/****************/
#defineLENGTHsizeof(Node)
/****************/
/*全局变量定义*/
/****************/
Node*list=NULL;
/****************/
/*子函数定义*/
/****************/
/*
**打印输出方法函数
*/
/*
**初期化函数
*/
Status
Use_Method(void)
{
printf("|*****使用**方法*****|\n");
printf("|**1—初期化链表**|\n");
printf("|**2—创建一链表**|\n");
printf("|**3—输出该链表**|\n");
printf("|**4—插入结点**|\n");
printf("|**5—删除结点**|\n");
printf("|**6—逆转链表**|\n");
printf("|**7—链表排序**|\n");
printf("|**8—终止程序**|\n");
printf("|**输入错误,再输入*|\n");
returnOK;
}/*Use_Method*/
Status
Init_List(Node**phead)
{
phead=NULL;
printf("初期化函数成功!
\n");
returnOK;
}/*Init_List*/
/*
**创建链表函数
*/
Status
Create_List(Node**phead)
{
Node*p,*q;
/*
**创建一链表
*/
printf("|******************|\n");
printf("|**创**建**链**表**|\n");
printf("|******************|\n");
/*
**指向第一个结点
*/
*phead=p=(Node*)malloc(LENGTH);
/*
**开辟内存失败
*/
if(NULL==p)
{
returnFALSE;
}
printf("请输入第一个结点数据:
\n");
scanf("%d",&p->value);
q=p;
/*
**指向第二个结点
*/
p=(Node*)malloc(LENGTH);
/*
**开辟内存失败
*/
if(NULL==p)
{
returnFALSE;
}
printf("请输入第二个结点数据:
\n");
/*
**开辟内存失败
*/
if(NULL==p)
{
returnFALSE;
}
scanf("%d",&p->value);
q->next=p;
q=p;
/*
**指向第三个结点
*/
p=(Node*)malloc(LENGTH);
printf("请输入第三个结点数据:
\n");
scanf("%d",&p->value);
q->next=p;
p->next=NULL;
printf("链表创建成功“^o^”\n\n");
returnOK;
}/*Create_List*/
/*
**查看链表函数
*/
Status
Show_List(Node*phead)
{
Node*p=phead;
inti=1;
/*
**打印输出标题
*/
if(1==i)
{
printf("|******************|\n");
printf("|**新建**的**链表**|\n");
printf("|******************|\n");
}
else
{
printf("|**********************|\n");
printf("|**变改**后**的**链表**|\n");
printf("|**********************|\n");
}
/*
**输出链表
*/
do
{
printf("%d->",p->value);
p=p->next;
}while(p->next!
=NULL);
printf("%d\n",p->value);
i++;
returnOK;
}/*Show_List*/
/*
**插入结点函数
*/
Status
Insert_List(Node**phead)
{
Node*p,*q;
intelement;
p=*phead;
printf("请输入插入结点数据的值:
\n");
scanf("%d",&element);
/*
**p指向第一结点时,就满足要求
*/
while(p->value>element)
{
Node*s=(Node*)malloc(LENGTH);
if(NULL==s)
{
returnFALSE;
}
s->value=element;
s->next=p;
*phead=s;
printf("结点数据插入头结点之前:
\n");
returnOK;
}
/*
**若第一个结点不满足怎继续往下查找
*/
while(p->value<=element)
{
q=p;
p=p->next;
/*
**p指向NULL,就结束循环,防止对p间接访问
*/
if(p==NULL)
{
printf("结点数据插入尾部结点之后:
\n");
break;
}
}
Node*s=(Node*)malloc(LENGTH);
if(NULL==s)
{
returnFALSE;
}
s->value=element;
s->next=p;
q->next=s;
returnOK;
}/*Insert_List*/
/*
**删除结点函数
*/
Status
Delete_List(Node**phead)
{
/*
**删除结点
*/
Node*p,*q;
intelement;
p=*phead;
printf("请输入删除结点的值:
\n");
scanf("%d",&element);
/*
**第一个结点数据是要删除的数据
*/
if(element==p->value)
{
*phead=p->next;
returnOK;
}
/*
**第一结点数据不是要删除的数据
*/
while(p!
=NULL)
{
if(element==p->value)
{
q->next=q->next->next;
free(p);
returnOK;
}
q=p;
p=p->next;
}
if(NULL==p)
{
printf("没有查找到要删除的节点数据\n");
returnERROR;
}
}/*Delete_List*/
/*
**链表逆序输出函数
*/
Status
Reverse_List(Node**phead)
{
/*
**链表逆转输出
*/
printf("|*******链表逆序输出*********|\n");
/*
**如果链表是空或者只有一个结点
*/
if(*phead==NULL||(*phead)->next==NULL)
{
returnOK;
}
/*
**链表有两个结点及以上
*/
Node*p=*phead,
*q=(*phead)->next,
*t=NULL;
while(q!
=NULL)
{
t=q->next;
q->next=p;
p=q;
q=t;
}
/*
**此时p指向原始链表最后一个元素,也是逆转后的链表的表头元素
*/
(*phead)->next=NULL;/*设置链表尾*/
*phead=p;/*调整链表头*/
returnOK;
}/*Reverse_List*/
/*
**链表冒泡法排序
*/
Status
Sort_List(Node**phead)
{
printf("链表按从大到小的顺序排序\n");
/*
**如果链表是空或者只有一个结点
*/
if(*phead==NULL||(*phead)->next==NULL)
{
returnOK;
}
/*
**链表有两个结点及以上
*/
Node*endp,/*控制循环比较*/
*p,/*临时变量*/
*p1,
*p2;
/*
**新增一个结点
*/
p1=(Node*)malloc(LENGTH);
p1->next=*phead;
*phead=p1;
for(endp=NULL;endp!
=*phead;endp=p)
{
for(p=p1=*phead;p1->next->next!
=endp;p1=p1->next)
{
if(p1->next->value>p1->next->next->value)/*如果前面的值大于后面的值*/
{
p2=p1->next->next;
p1->next->next=p2->next;
p2->next=p1->next;
p1->next=p2;
p=p1->next->next;
}
}
}
/*
**把添加的结点去掉
*/
p1=*phead;
(*phead)=(*phead)->next;
free(p1);
p1=NULL;
returnOK;
}/*Sort_List*/
intmain(void)
{
intOptions;
inti=0;
/*
**大循环
*/
while
(1)
{
Use_Method();/*给出使用方法*/
/*
**选择功能
*/
printf("请输入相应命令\n");
scanf("%d",&Options);
switch(Options)
{
case1:
/*初期化函数*/
Init_List(&list);
break;
case2:
/*创建一链表*/
Create_List(&list);
break;
case3:
/*输出该链表*/
Show_List(list);
break;
case4:
/*插入节点*/
Insert_List(&list);
break;
case5:
/*删除结点*/
Delete_List(&list);
break;
case6:
/*链表逆转*/
Reverse_List(&list);
break;
case7:
/*链表排序*/
Sort_List(&list);
break;
case8:
/*程序结束*/
break;
default:
/*输出Options错误*/
i=1;
break;
}
/*
**结束程序
*/
if(8==Options)
{
printf("***************结束程序,谢谢!
************\n");
break;
}
if(1==i)
{
printf("输入命令错误,请重新输入:
\n");
}
}
return0;
}
/***********************EndOfFile**************************/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 结构 指针 单链表 部分