早教吧作业答案频道 -->其他-->
编写一个完整的程序,实现单链表的建立、插入、删除、输出等基本操作。1)建立一个带头结点的单链表。(2)计算单链表的长度,然后输出单链表。(3)查找值为x的直接前驱结点q。(4
题目详情
编写一个完整的程序,实现单链表的建立、插入、删除、输出等基本操作。
1)建立一个带头结点的单链表。
(2)计算单链表的长度,然后输出单链表。
(3)查找值为x的直接前驱结点q。
(4)删除值为x的结点。
(5)把单向链表中元素逆置(不允许申请新的结点空间)。
(6)利用(1)建立的链表,实现将其分解成两个链表,其中一个全部为奇数,另一个全部为偶数(尽量利用已知的存储空间)。
(7)在主函数中设计一个简单的菜单,分别测试上述算法
1)建立一个带头结点的单链表。
(2)计算单链表的长度,然后输出单链表。
(3)查找值为x的直接前驱结点q。
(4)删除值为x的结点。
(5)把单向链表中元素逆置(不允许申请新的结点空间)。
(6)利用(1)建立的链表,实现将其分解成两个链表,其中一个全部为奇数,另一个全部为偶数(尽量利用已知的存储空间)。
(7)在主函数中设计一个简单的菜单,分别测试上述算法
▼优质解答
答案和解析
typedef int Elemtype;
typedef int status;
#define OVERFLOW -2
#define OK 1
#define ERROR -1
#include "stdio.h"
#include "stdlib.h"
typedef struct LNode {
Elemtype data;
struct LNode *next;
}*linklist;
//构造链表
void Create_Linklist(linklist &L)
{
linklist p;
p=(linklist)malloc(sizeof(LNode));
if(!p)
exit(OVERFLOW);
L=p;
L->next =NULL;
}
//节点插入
void Insert_Linklist(linklist &L)
{
linklist p;
int n,i;
printf("请输入插入节点的个数n: ");
scanf("%d",&n);
getchar();
for(i=n;i>0;i--)
{
p=(linklist )malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=L->next ;
L->next =p;
}
}
//遍历输出并输出长度
status Visit_linklist(linklist &L)
{
linklist p;
int i=1;
p=L->next ;
if(L->next==NULL)
return ERROR;
while(p->next !=NULL)
{
printf("%d ",p->data );
p=p->next ;
i++;
}
printf("%d\n",p->data );
printf("长度为:%d\n",i);
return OK;
}
//查找值为x的直接前驱结点q并输出
void Search_linklist(linklist &L)
{
int x,k=0;
linklist p=L,q;
printf("输入x: ");
scanf("%d",&x);
getchar();
if(L->next ==NULL)
printf("该表为空 !\n");
while(p->next!=NULL)
{
q=p;
if(p->next ->data ==x)
{
printf("%d ",q->data );
k=1;
}
p=p->next ;
}
if(p->next &&p->data ==x)
{
printf("%d ",p->data );
k=1;
}
if(k==0)
printf("未找到值为%d的结点\n",&x);
printf("\n");
}
//删除节点
status Delete_linklist(linklist &L)
{
linklist p,q;
int k=0,x;
printf("请输入删除节点的值x: ");
scanf("%d",&x);
getchar();
if(L->next ==NULL)
return ERROR;
p=L;
q=L->next ;
while(q!=NULL)
if(q->data ==x)
{
k=1;
p=q ;
p->next =q->next ;
free(q);
q=p->next ;
}
else
{
p=q ;
q=p->next ;
}
if(k==0)
printf("表中没有值为%d的结点!\n",&x);
return OK;
}
//链表逆置
void ListInverse_linkliast(linklist &L)
{
linklist k,p,q;
p=L;
while (p->next !=NULL)
{
p=p->next ;
}
k=p;
while (L->next !=p)
{
q=L->next ;
L->next = q->next ;
k->next =q;
}
}
//链表奇偶分解
void Break_linklist (linklist &La,linklist &Lb)
{
linklist p,q;
p=La->next;
q=Lb;
while(p->next!=NULL)
{
if(p->data %2==0)
{
q->next =p;
q=q->next ;
}
p=p->next ;
}
if(p->data %2==0)
{
q->next =p;
q=q->next ;
}
}
//主菜单
void main()
{
linklist L1,L2;
printf(" (1) 建立带头节点的单链表\n");
printf(" (2) 插入节点\n");
printf(" (3) 计算链表长度并输出单链表\n");
printf(" (4) 查找值为x的直接前驱结点并输出其值\n");
printf(" (5) 删除节点值为x的结点\n");
printf(" (6) 逆置单链表结点\n");
printf(" (7) 单链表奇偶分解\n");
int choice;
printf(" 请输入选择:");
while(scanf("%d",&choice))
{
getchar();
printf("\n\n");
switch(choice)
{
case 1:
Create_Linklist(L1);
break;
case 2:
Insert_Linklist(L1);
break;
case 3:
Visit_linklist(L1);
break;
case 4:
Search_linklist(L1);
break;
case 5:
Delete_linklist(L1);
break;
case 6:
ListInverse_linkliast(L1);
break;
case 7:
Create_Linklist(L2);
Break_linklist (L1,L2);
break;
default:
printf(" 输入有误!");
break;
}
}
}
typedef int status;
#define OVERFLOW -2
#define OK 1
#define ERROR -1
#include "stdio.h"
#include "stdlib.h"
typedef struct LNode {
Elemtype data;
struct LNode *next;
}*linklist;
//构造链表
void Create_Linklist(linklist &L)
{
linklist p;
p=(linklist)malloc(sizeof(LNode));
if(!p)
exit(OVERFLOW);
L=p;
L->next =NULL;
}
//节点插入
void Insert_Linklist(linklist &L)
{
linklist p;
int n,i;
printf("请输入插入节点的个数n: ");
scanf("%d",&n);
getchar();
for(i=n;i>0;i--)
{
p=(linklist )malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=L->next ;
L->next =p;
}
}
//遍历输出并输出长度
status Visit_linklist(linklist &L)
{
linklist p;
int i=1;
p=L->next ;
if(L->next==NULL)
return ERROR;
while(p->next !=NULL)
{
printf("%d ",p->data );
p=p->next ;
i++;
}
printf("%d\n",p->data );
printf("长度为:%d\n",i);
return OK;
}
//查找值为x的直接前驱结点q并输出
void Search_linklist(linklist &L)
{
int x,k=0;
linklist p=L,q;
printf("输入x: ");
scanf("%d",&x);
getchar();
if(L->next ==NULL)
printf("该表为空 !\n");
while(p->next!=NULL)
{
q=p;
if(p->next ->data ==x)
{
printf("%d ",q->data );
k=1;
}
p=p->next ;
}
if(p->next &&p->data ==x)
{
printf("%d ",p->data );
k=1;
}
if(k==0)
printf("未找到值为%d的结点\n",&x);
printf("\n");
}
//删除节点
status Delete_linklist(linklist &L)
{
linklist p,q;
int k=0,x;
printf("请输入删除节点的值x: ");
scanf("%d",&x);
getchar();
if(L->next ==NULL)
return ERROR;
p=L;
q=L->next ;
while(q!=NULL)
if(q->data ==x)
{
k=1;
p=q ;
p->next =q->next ;
free(q);
q=p->next ;
}
else
{
p=q ;
q=p->next ;
}
if(k==0)
printf("表中没有值为%d的结点!\n",&x);
return OK;
}
//链表逆置
void ListInverse_linkliast(linklist &L)
{
linklist k,p,q;
p=L;
while (p->next !=NULL)
{
p=p->next ;
}
k=p;
while (L->next !=p)
{
q=L->next ;
L->next = q->next ;
k->next =q;
}
}
//链表奇偶分解
void Break_linklist (linklist &La,linklist &Lb)
{
linklist p,q;
p=La->next;
q=Lb;
while(p->next!=NULL)
{
if(p->data %2==0)
{
q->next =p;
q=q->next ;
}
p=p->next ;
}
if(p->data %2==0)
{
q->next =p;
q=q->next ;
}
}
//主菜单
void main()
{
linklist L1,L2;
printf(" (1) 建立带头节点的单链表\n");
printf(" (2) 插入节点\n");
printf(" (3) 计算链表长度并输出单链表\n");
printf(" (4) 查找值为x的直接前驱结点并输出其值\n");
printf(" (5) 删除节点值为x的结点\n");
printf(" (6) 逆置单链表结点\n");
printf(" (7) 单链表奇偶分解\n");
int choice;
printf(" 请输入选择:");
while(scanf("%d",&choice))
{
getchar();
printf("\n\n");
switch(choice)
{
case 1:
Create_Linklist(L1);
break;
case 2:
Insert_Linklist(L1);
break;
case 3:
Visit_linklist(L1);
break;
case 4:
Search_linklist(L1);
break;
case 5:
Delete_linklist(L1);
break;
case 6:
ListInverse_linkliast(L1);
break;
case 7:
Create_Linklist(L2);
Break_linklist (L1,L2);
break;
default:
printf(" 输入有误!");
break;
}
}
}
看了 编写一个完整的程序,实现单链...的网友还看了以下:
1和0.999999(无限循环)比较,真的一样大?.0.9999……9除以3等于0.3333……3 2020-05-16 …
对1 2 3 4可作运算(1+2+3)×4=24 现有有理数3 5 -6 10 请运用加减乘除法写 2020-05-16 …
为什么我的计算器casiofx-991esplus用除号除数时会等於份数?新买的,我用8除以3再按 2020-05-21 …
整除和被整除到底是谁除谁啊谁谁能被3整除.和3能被谁整除到底是什么呀?我这人很死脑筋,且大声给个简 2020-06-08 …
去除和除以意思相同还是和除意思相同?急用,比如:2与2的和去除3,结果多少?算式是(2+2)*3还 2020-06-10 …
它不给我写出来.10.8除以1.2、2.52除以3.6、142.2除以0.18、197.6除以0. 2020-07-18 …
简便计算1.64除以1.25除以3.2除以0.82.21除以2.53.3.6×25.4+37.9× 2020-07-18 …
先用分离系数法求出f(x)除以g(x)所得的商式和余式,不再作除法,写出f(x)除以h(x)的商式 2020-07-30 …
为什么12能被3整除是12除以3?不是3除以12吗?我是说12能被3整出按照现在的中文的意思不是应该 2020-11-17 …
公司增资要写出资转让书:公司现有3个股东A,B,C。A占出资额40%,B和C各占30%。A现要转让出 2020-12-31 …