永发信息网

怎样在下面的程序中加入一个查找功能?

答案:1  悬赏:40  手机版
解决时间 2021-05-06 22:24

#define NULL 0
#define TYPE struct node
#define LEN sizeof(struct node)
struct node
{
int num;
struct node *next;
};
TYPE * creat(int n)
{
struct node *head,*pf,*pb;
int i;
for(i=0;i<n;i++)
{
pb=(TYPE *)malloc(LEN);
printf("please input the node\n");
scanf("%d",&pb->num);
if(i==0)
pf=head=pb;
else pf->next=pb;
pb->next=NULL;
pf=pb;
}
return(head);
}

TYPE * delete(TYPE * head,int num)
{
TYPE *pf,*pb;
if(head==NULL)
{ printf("\nempty list!\n");
goto end;}
pb=head;
while (pb->num!=num && pb->next!=NULL)
{pf=pb;pb=pb->next;}
if(pb->num==num)
{ if(pb==head) head=pb->next;
else pf->next=pb->next;
printf("The node is deleted\n"); }
else
free(pb);
printf("The node not been found!\n");
end:
return head;
}
TYPE * insert(TYPE * head,TYPE * pi)
{
TYPE *pb ,*pf;
pb=head;
if(head==NULL)
{ head=pi;
pi->next=NULL; }
else
{
while((pi->num>pb->num)&&(pb->next!=NULL))
{ pf=pb;
pb=pb->next; }
if(pi->num<=pb->num)
{ if(head==pb) head=pi;
else pf->next=pi;
pi->next=pb; }
else
{ pb->next=pi;
pi->next=NULL; }
}
return head;
}
void print(TYPE * head)
{
printf("the list is:\n");
while(head!=NULL)
{
printf("%d\n",head->num);
head=head->next;
}
}
main()
{
TYPE * head,*pnum;
int n,num;
printf("input the number of node: ");
scanf("%d",&n);
head=creat(n);
print(head);

printf("Input the deleted number: ");
scanf("%d",&num);
head=delete(head,num);
print(head);
printf("Input the inserted number: ");
pnum=(TYPE *)malloc(LEN);
scanf("%d",&pnum->num);
head=insert(head,pnum);
print(head);
getch();
}

或者帮我用winTC编出一个新程序,实现N结点单链表的建立、查找、删除和插入功能。万分感谢!!

最佳答案

我是在 VC++6.0 上写的.........关于链表的查找,删除,插入,销毁..........





代码如下:










#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;


typedef struct node_tag
{
ElemType data;
struct node_tag *next;
}*Linklist,Lnode;


void initLinklist(Linklist *head) //初始化链表
{
*head=(Lnode *)malloc(sizeof(Lnode));
if(*head==NULL)
{
printf("初始化失败.\n");
exit(0);
}
(*head)->next=NULL;
}


void insertLinklist(Linklist head,int n) //向链表中插入元素
{
Linklist p,q=head;
while(q->next)
q=q->next; //q指向链表的最后一个结点
p=(Lnode*)malloc(sizeof(Lnode));
if(p==NULL)
{
printf("插入元素时分配空间失败>\n");
exit(0);
}
p->data=n;
q->next=p;
p->next=NULL;
}


int deleteLinklist(Linklist head,int i) //删除链表中第i个元素
{
Linklist p=head,q;
int j=0,e; //e返回删除元素的值
while(p->next && j<i-1)
{
p=p->next;
j++;
}
if(!(p->next) || j>i-1)
return -1;
q=p->next;
p->next=q->next;
e=q->data;
free(q);
return e;
}


int searchLinklist(Linklist head,int n) //在链表中查找元素n
{
Linklist p=head;
int i=0; //i是此元素的位置
while(p->next && p->next->data!=n)
{
p=p->next;
i++;
}
if(! (p->next) )
return -1; //没找到此元素
return i+1;
}


void destroyLinklist(Linklist *head) //销毁链表
{
Linklist p=*head,q;
while( p )
{
q=p;
p=p->next;
free(q);
}
p=NULL;
printf("销毁成功.\n");
}


void print(Linklist head) //打印链
{
Linklist p=head;
if( !(head->next) )
{
printf("NULL");
return;
}
while(p->next)
{
printf("%d ",p->next->data);
p=p->next;
}
}


void menu()
{
printf("\n*******************\n");
printf("1.向链表插入元素.\n");
printf("2.删除连表中的元素.\n");
printf("3.销毁链表.\n");
printf("4.在链表中查找元素.\n");
printf("5.打印链表.\n");
printf("6.退出.\n");
printf("请输入你的选择:");
}


int selecte(Linklist head)
{
int n,flag=1,e=0;
menu();
scanf("%d",&n);
printf("\n");
while(n<1 || n>6)
{
printf("输入错误,请重新输入:");
scanf("%d",&n);
printf("\n");
}
switch(n)
{
case 1: printf("请输入你要插入的元素(-1 exit)\n:");
scanf("%d",&e);
while(e !=-1)
{
insertLinklist(head,e);
scanf("%d",&e);
}
printf("\n插入完成.\n");
break;
case 2: printf("请输入你要删除的元素的位置(>=1):");
int i,r;
scanf("%d",&i);
r=deleteLinklist(head,i);
if(r==-1)
{
printf("删除位置出错.\n");
break;
}
printf("删除的元素的:%d\n",r);
break;
case 3: destroyLinklist(&head);
break;
case 4: printf("请输入你要查找的元素:");
int m;
scanf("%d",&m);
r=searchLinklist(head,m);
if(r==-1)
{
printf("\n链表中无此元素.\n");
break;
}
printf("此元素在链表中第一次出现的位置是:%d\n",r);
break;
case 5: printf("链表的元素分别是:");
print(head);
printf("\n");
break;
case 6: flag=0;
}
return flag;
}


int main()
{
Linklist head=NULL;
initLinklist(&head);
int flag=selecte(head);
while(flag)
flag=selecte(head);
printf("*******谢谢使用*******\n");
return 1;
}



我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
关于爱护自己形象的名言
泰安旭煜建筑劳务有限公司这个地址在什么地方
为什么人的手有时拿针刺都没反映
战国魏国的建立者是谁,魏国的创立者是谁
25-45级史诗巨剑炙炎梵天剑分别那里出??
急求宁波大学科学技术学院的地址与邮编
爱宠国的狗狗怎样才能注销了,健康是0很久了
关于CPU散热器问题
宏声电器修理中心地址有知道的么?有点事想过
机器侠首映上有没有承诺要拍第2部
杀毒软件用什么的好??不要卡巴……
CF 什么级数可以创建站队啊
我想知道这视频的歌曲名字是什么我想下载来听
3.5.3.5.3.5.3.5 的通项公式是什么?
请高人帮算算我和这两个的缘份多深?
推荐资讯
11月份怎么取消万话筒
临沂地区平房和楼房之间的距离是多少?有法律
梦幻诛仙武器制造制造30级武器一次给多少熟练
DNF成为师徒关系怎么还有COF点啊?
红蜻蜓家居生活馆地址有知道的么?有点事想过
谷山这个地址在什么地方,我要处理点事
眼睛视力近视问题
龙之谷剑圣剑西和魔系
家用烟机走势
CS地图制作的一些问题~请高手帮帮忙~~谢谢!
女友让你给她摘颗星星送给她,该怎么回答?
我不会玩怎么办?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?