#include <stdio.h>
#include <stdlib.h>
typedef struct LNode
{
int data;
struct LNode *next;
} LNode, *LinkList;
LinkList L;//全局变量L;
LinkList HEAD_INSERT()//头插法
{
LNode *s;
int x;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;//建立头指针
scanf("%d",&x);
while(x != 999)
{
s=(LinkList)malloc(sizeof(LNode)); //每次申请节点域;
s->data=x;
s->next=L->next;
L->next=s;
scanf("%d",&x);
}
return L;
}
void print_list()
{
LinkList p;
p=L->next;//p指向单链表第一个节点
while( p )
{
printf("%5d",p->data);
p=p->next;
}
}
LNode * get_pre(int i)//获得前驱节点
{
int j=1;
LNode *p;
p=L->next;
if( i == 0 )
return L;
if( i < 0 )
return NULL;//参数不合法
while ( p && j < i )
{
p=p->next;
++j;
}
return p;//返回查找到的前驱节点;
}
void list_insert()//插入链表
{
int x;
int i;
LNode *p,*s;
s = (LinkList) malloc(sizeof(LNode ));
printf("请输入要插入的数据: \n");
scanf("%d",&x);
printf("请输入要插入的位置: \n");
scanf("%d",&i);
s->data=x;
p=get_pre(i-1);//记录要插位置 的前驱节点;
s->next=p->next;//改变链表指针的指向,实现插入操作;
p->next=s;//上面一句语句和本行语句顺序不可颠倒,否则断链;
}
void delete_list()
{
int i;
LNode *p;
LNode *q,*s;
printf("输入要删除的节点的序号: \n");
scanf("%d",&i);
p=get_pre(i-1);//寻找被删除的节点的前驱;
s=p->next;//s即为被删除的节点;
q=p->next->next;//记录被删除节点的后继;
p->next=q;//改变链指针的指向,删除s
free(s);//释放被删除节点的空间;
}
void deletex()
{
int i;
LNode *s;
printf("输入要删除的节点的数字: \n");
scanf("%d",&i);
while(L->next!=NULL)
{
if(L->data==i)
{
s=L;//s即为被删除的节点;
s->next=L->next;
L=L->next;
free(s);//释放被删除节点的空间;
}
L=L->next;
}
}
int main()
{
printf("请输入链表(输入999结束):\n");
HEAD_INSERT();
printf("初始链表为: \n");
print_list();
printf("\n");
printf("删除输入值之后的链表: \n");
deletex();
print_list();
list_insert();
printf("插入之后的链表: \n");
print_list();
printf("\n");
delete_list();
printf("删除之后的链表: \n");
print_list();
printf("\n");
return 0;
}
改为删除某一固定值的单链表,但为什么传不回去
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- qzjhjxj 2021-10-03 21:32关注
修改如下,供参考:
#include <stdio.h> #include <stdlib.h> typedef struct LNode { int data; struct LNode *next; } LNode, *LinkList; LinkList L;//全局变量L; LinkList HEAD_INSERT()//头插法 { LNode *s; int x; L=(LinkList)malloc(sizeof(LNode)); L->next=NULL;//建立头指针 scanf("%d",&x); while(x != 999) { s=(LinkList)malloc(sizeof(LNode)); //每次申请节点域; s->data=x; s->next=L->next; L->next=s; scanf("%d",&x); } return L; } void print_list() { LinkList p; p=L->next;//p指向单链表第一个节点 while( p ) { printf("%5d",p->data); p=p->next; } } LNode * get_pre(int i)//获得前驱节点 { int j=1; LNode *p; p=L->next; if( i == 0 ) return L; if( i < 0 ) return NULL;//参数不合法 while ( p && j < i ) { p=p->next; ++j; } return p;//返回查找到的前驱节点; } void list_insert()//插入链表 { int x; int i; LNode *p,*s; s = (LinkList) malloc(sizeof(LNode )); printf("请输入要插入的数据: \n"); scanf("%d",&x); printf("请输入要插入的位置: \n"); scanf("%d",&i); s->data=x; p=get_pre(i-1);//记录要插位置 的前驱节点; s->next=p->next;//改变链表指针的指向,实现插入操作; p->next=s;//上面一句语句和本行语句顺序不可颠倒,否则断链; } void delete_list() { int i; LNode *p; LNode *q,*s; printf("输入要删除的节点的序号: \n"); scanf("%d",&i); p=get_pre(i-1);//寻找被删除的节点的前驱; s=p->next;//s即为被删除的节点; q=p->next->next;//记录被删除节点的后继; p->next=q;//改变链指针的指向,删除s free(s);//释放被删除节点的空间; } void deletex() { int i; LNode *s=NULL,*q=NULL,*p=L->next;//修改 printf("输入要删除的节点的数字: \n"); scanf("%d",&i); while(p!=NULL)//修改 { if(p->data==i) //修改 { q=p;//q即为被删除的节点; if(p == L->next){ //修改 L->next = p->next; p = L->next; //p返回前一结点 } else{ s->next = p->next; //修改 p = s; //p返回前一结点 } free(q);//释放被删除节点的空间; } s = p; p=p->next; //修改 } } int main() { printf("请输入链表(输入999结束):\n"); HEAD_INSERT(); printf("初始链表为: \n"); print_list(); printf("\n"); printf("删除输入值之后的链表: \n"); deletex(); print_list(); list_insert(); printf("插入之后的链表: \n"); print_list(); printf("\n"); delete_list(); printf("删除之后的链表: \n"); print_list(); printf("\n"); return 0; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥30 YOLO检测微调结果p为1
- ¥20 求快手直播间榜单匿名采集ID用户名简单能学会的
- ¥15 DS18B20内部ADC模数转换器
- ¥15 做个有关计算的小程序
- ¥15 MPI读取tif文件无法正常给各进程分配路径
- ¥15 如何用MATLAB实现以下三个公式(有相互嵌套)
- ¥30 关于#算法#的问题:运用EViews第九版本进行一系列计量经济学的时间数列数据回归分析预测问题 求各位帮我解答一下
- ¥15 setInterval 页面闪烁,怎么解决
- ¥15 如何让企业微信机器人实现消息汇总整合
- ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题