#include <stdio.h>
#include <stdlib.h>
struct node{
int a;
struct node *pnext;
};
//头尾指针
struct node *phead=NULL;
struct node *pend=NULL;
//遍历链表
void scanlist();
//尾添加
void wtj(int a);
//头添加
void ttj(int a);
//指定位置添加数据
void tianjiashuju(int b,int a);
//指定 查询 链表
struct node * zhilist(int b);
//头删除
void tsc();
//尾删除
void wsc();
//删除指定节点
void sczdjd(int c);
//栈 头添加+头删除
//队列 头添加+尾删除 尾添加+头删除
//创建链表,在链表中创建一个数据 头添加
void ttj(int a){
//创建一个节点
struct node *pt=(struct node *)malloc(sizeof(struct node));
//节点赋值
pt->a=a;
pt->pnext=NULL;
//链接
if(NULL==phead){
//链表没有 东西的时候即是头也是尾
phead =pt;
pend=phead;
}else{
pt->pnext=phead;
phead=pt;
}
}
//指定 查询 链表
struct node * zhilist(int b){
struct node *pt=phead;
while(pt!=NULL){
if(pt->a==b){
return pt;
}
printf("%d\n",pt->a);
pt=pt->pnext;
}
return NULL;
}
//指定位置添加数据
void tianjiashuju(int b,int a){
//链表为空
if (NULL == phead){
printf("链表没有节点\n");
return;
}
struct node *pt=zhilist(b);
if(NULL==pt){
printf("没有指定节点");
return ;
}
//有此节点
//给a创建节点
struct node *ptem=(struct node *)malloc(sizeof(struct node));
//节点成员赋值
ptem->a=a;
ptem->pnext=NULL;
//链接到链表上
if(pt==pend){
pend->pnext=ptem;
pend=ptem;
}else{
}
ptem->pnext=pt->pnext;
pt->pnext=ptem;
}
//遍历链表 查
void scanlist(){
struct node *pt=phead;
while(pt!=NULL){
printf("%d",pt->a);
pt=pt->pnext;
}
printf("\n");
}
//创建链表,在链表中创建一个数据 尾添加
void wtj(int a){
//创建一个节点
struct node *pt=(struct node *)malloc(sizeof(struct node));
//节点赋值
pt->a=a;
pt->pnext=NULL;
//链接
if(NULL==phead){
//链表没有 东西的时候即是头也是尾
phead =pt;
pend=pt;
}else{
//不为空 往头上去添加
pend->pnext=pt;
//头一直指向一个节点
pend=pt;
}
}
//释放链表
void ffree(){
//记录头,防止头被修改 丢内存
struct node *pt=phead;
while(pt!=NULL){
struct node *pu=pt;
pt=pt->pnext;
free(pu);
}
//头尾清空,方便下次使用
phead=NULL;
pend=NULL;
}
//头删除
void tsc(){
//链表检测
if(NULL==phead){
printf("链表为空,无需释放\n");
return;
}
//记住旧的头
struct node *pm=phead;
//头的下一个节点变成头
phead=phead->pnext;
free(pm);
}
//尾删除
void wsc(){
//链表检测
if(NULL==phead){
printf("链表为空,无需释放\n");
return;//结束
}
//链表不为空
//链表有一个节点
if(phead==pend){
free(phead);
phead=NULL;
pend=NULL;
}
else{
//找尾巴前一个节点,用遍历方法
//遍历从头开始
struct node *ptm=phead;
while(ptm->pnext!=pend){
ptm=ptm->pnext;
}
//找到了,删除尾巴
//先释放尾巴
free(pend);
//使之尾巴前一个节点成为最后一个
pend=ptm;
//尾巴的下一个赋值为空
pend->pnext=NULL;
}
}
//删除指定节点
void sczdjd(int b){
//链表判断
//链表检测
if(NULL==phead){
printf("链表为空,无需释放\n");
return;//结束
}
struct node *pt=zhilist(b);
if(NULL==pt){
printf("查无此节点\n");
return;//结束
}
//找到了
//只有一个节点
if(phead==pend){
free(phead);
phead=NULL;
pend=NULL;
}
//只有两个的时候
else if(phead->pnext=pend){
if(phead==pt){
tsc();
}
else{
wsc();
}
}
//多个节点的时候
else{
if(phead==pt){
tsc();
}else if(pend==pt){
wsc();
}
else{
//找尾巴前一个节点,用遍历方法
//遍历从头开始
struct node *ptm=phead;
while(ptm->pnext!=pend){
ptm=ptm->pnext;
}
//z找到了
ptm->pnext = pt->pnext;
//释放链表
free(pt);
}
}
}
int main()
{
int i=0;
phead;
int a[10]={1,2,3,4,5,6,7};
for(i=0;i<7;i++){
ttj(a[i]);
}
//tianjiashuju(4,14);
/*struct node *find=zhilist(5);
if(find!=NULL){
printf("找到了%d\n",find->a);
}else{
printf("没有找到\n");
}
ffree();
for(i=0;i<7;i++){
ttj(a[i]);
}
*/
scanlist();
sczdjd(8);
scanlist();
//释放链表
ffree();
system("pause");
return 0;
}
无空头链表的完整代码
最新推荐文章于 2021-06-16 12:36:48 发布