#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; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 有没有办法利用libusb读取usb设备数据
- ¥15 为什么openeluer里面按不了python3呢?
- ¥15 关于#matlab#的问题:训练序列与输入层维度不一样
- ¥15 关于Ubuntu20.04.3LTS遇到的问题:在安装完CUDA驱动后,电脑会进入卡死的情况,但可以通过键盘按键进入安全重启,但重启完又会进入该情况!
- ¥15 关于#嵌入式硬件#的问题:树莓派第一天重装配置python和opencv后第二天打开就成这样,瞎捣鼓搞出来文件夹还是没把原来的界面调回来
- ¥20 Arduino 循迹小车程序电路出错故障求解
- ¥20 Arduino 循迹小车程序电路出错故障求解
- ¥15 C++数组中找第二小的数字程序纠错
- ¥15 wannier复现图像时berry曲率极值点与高对称点严重偏移
- ¥15 利用决策森林为什么会出现这样·的问题(关键词-情感分析)