《数据结构》实验报告
实验序号 3 实验项目名称链式表的操作
附源程序清单
1、
#include"stdio.h"
#inclu de"string.h"
#include"stdlib.h"
#in clu de"ctype.h"typedef struct node //定义结点
{char data[10] ; //结点的数据域为字符串struct node *next; //结点的指针域char*L;
}Lis tNode;type de f ListNode *Link List; // 自定义Link Lis t单链表类型
LinkList CreatListR1(); //函数用尾插入法建立带头结点的单链表LinkList CreatListR(); //函数用头插入法建立带头结点的单链表
LinkList LocateNode(LinkList head,char*key); //函数按值查找结点void DeleteList(LinkList head,char*key); //函数删除指定值的结点LinkList LocateBreforeNode(LinkList head, char *key); //函数查找指定数值的前驱结点void DeleteBreforeNode(LinkList head,char *key); //函数删除指定数值的前驱结点void printlist(LinkList head); //函数打印链表中的所有值void DeleteAll(LinkList head); //函数删除所有结点释放内存//==========主函数==============void main()
{char*ch,*num;num=new char;ch=new char[10] ;
LinkList he ad;
LinkList pm;
head=CreatListR1(); //用尾插入法建立单链表返回头指针printlist(he ad); //遍历链表输出其值printf("Delete node(y/n):"); //输入"y"或"n"去选择是否删除结点scanf("%s",num);if(strcmp(num,"y")==0| | strcmp(num,"Y")==0)
{printf("Please input Delete_data:");scanf("%s",ch); //输入要删除的字符串
DeleteList(head,ch);printlist(he ad);
}printf("输入要查找的数值");s canf("%s",ch);pm=LocateNode(head, ch);printf("%s\n",pm->data);printf("输入要删除的数值的前驱结点");s canf("%s",ch);
DeleteBreforeNode(head,ch);printlist(he ad);printf("对单循环链表进行逆序输出\n");head=CreatListR(); //用头插入法建立单链表返回头指针printlist(he ad);
//DeleteAll(he ad); //删除所有结点释放内存
}
//==========查找的指定数值的前驱结点=======
LinkList LocateBreforeNode(LinkList head, char*key)
{
ListNode *p=head->next; //从开始结点比较
Lis tNode *t ; //p的上一个节点指针while(p&&strcmp(p->data,key)!=0) //直到p为NULL或p->data为key止
{t=p; //记录上一个节点的指针p=p->next; //扫描下一个结点
}return t; //若p=NULL则查找失败否则p指向找到的值为key的结点}
//==========删除的指定数值的前驱结点=======void DeleteBreforeNode(LinkList head,char*key)
{
ListNode *pp,*r,*q=he ad;pp=LocateBre foreNode(he ad,k ey); //按key值查找结点的if(pp==NULL)
{ //若没有找到结点退出printf("position error");
exit(0);
}while(q->ne xt!=pp) //p为要删除的结点 q为p的前结点q=q->next;r=q->next;q->next=r->next;free(r); //释放结点
}
//==========用尾插入法建立带头结点的单链表===========LinkList CreatListR1(void)
{char*ch;ch=new char[10] ;
LinkList he ad=(LinkList)malloc(size of(ListNode)); //生成头结点ListNode *s,*r;r=he ad;r->ne xt=NULL;printf("Input#to end "); //输入"#"代表输入结束printf("Please input Node_data:");scanf("%s",ch); //输入各结点的字符串while(strcmp(ch,"#")!=0)
{s=(ListNode *)malloc(sizeof(ListNode));strcpy(s->data,ch);r->next=s;r=s;r->next=NULL;
//printf("Input#to end ");
//printf("Please input Node_data:");scanf("%s",ch);
}return head; //返回头指针
}
//==========用头插入法建立带头结点的单链表===========LinkList CreatListR(void)
{
LinkList he ad=(LinkList)malloc(size of(ListNode)); //生成头结点ListNode *s,*r;r=he ad;r->ne xt=NULL;printf("Input#to end "); //输入"#"代表输入结束printf("Please input cricle Node_data:");//输入各结点的字符串do//while(strcmp(s->data,"#")!=0)
{s=(LinkList)malloc(size of(ListNode));s canf("%s",s->data);s->ne xt=r->ne xt;r->ne xt=s;
}while(strcmp(s->data,"#")!=0);r->ne xt=r->ne xt->ne xt;return head; //返回头指针
}
//==========按值查找结点找到则返回该结点的位置否则返回NULL==========LinkList LocateNode(LinkList head,char*key)
{
ListNode *p=head->next; //从开始结点比较while(p&&strcmp(p->data,key)!=0) //直到p为NULL或p->data为key止p=p->next; //扫描下一个结点return p; //若p=NULL则查找失败否则p指向找到的值为key的结点}
//==========删除带头结点的单链表中的指定结点=======void DeleteList(LinkList head,char*key)
{
ListNode *p,*r,*q=head;p=LocateNode(head,key); //按key值查找结点的if(p==NULL)
{ //若没有找到结点退出printf("position error");exit(0);
}while(q->ne xt!=p) //p为要删除的结点 q为p的前结点q=q->next;r=q->next;q->next=r->next;free(r); //释放结点
}
//===========打印链表=======void printlist(LinkList head)
{
ListNode *p=head->next; //从开始结点打印while(p)
{printf("%s, ",p->data);p=p->next;
}
printf("\n");
}
//==========删除所有结点释放空间===========void DeleteAll(LinkList head)
{
ListNode *p=head,*r;while(p->ne xt)
{r=p->next;free(p);p=r;
}free(p);
}
1 .
#include"stdio.h"
#inclu de"string.h"
#include"stdlib.h"
#in clu de"ctype.h"typedef struct node //定义结点
{char data[10] ; //结点的数据域为字符串struct node *next; //结点的指针域char*L;
}Lis tNode;type de f ListNode *Link List; // 自定义Link Lis t单链表类型
LinkList CreatListR1(); //函数用尾插入法建立带头结点的单链表LinkList CreatListR(); //函数用头插入法建立带头结点的单链表
LinkList LocateNode(LinkList head,char*key); //函数按值查找结点void DeleteList(LinkList head,char*key); //函数删除指定值的结点LinkList LocateBreforeNode(LinkList head, char *key); //函数查找指定数值的前驱结点void DeleteBreforeNode(LinkList head,char *key); //函数删除指定数值的前驱结点void printlist(LinkList head); //函数打印链表中的所有值void DeleteAll(LinkList head); //函数删除所有结点释放内存//==========主函数==============void main()
{char*ch,*num;num=new char;ch=new char[10] ;
LinkList he ad;
LinkList pm;
Budgetvm(原EZ机房),2005年成立的美国老品牌机房,主打美国4个机房(洛杉矶、芝加哥、达拉斯、迈阿密)和日本东京机房的独立服务器和VPS业务,而且不限制流量,默认提供免费的1800G DDoS防御服务,支持IPv6和IPMI,多种免费中文操作系统可供选择,独立服务器主打大硬盘,多硬盘,大内存,用户可以在后台自行安装系统等管理操作!内存可定制升级到1536G,多块硬盘随时加,14TBSA...
今天下午遇到一个网友聊到他昨天新注册的一个域名,今天在去使用的时候发现域名居然不见。开始怀疑他昨天是否付款扣费,以及是否有实名认证过,毕竟我们在国内域名注册平台注册域名是需要实名认证的,大概3-5天内如果不验证那是不可以使用的。但是如果注册完毕的域名找不到那也是奇怪。同时我也有怀疑他是不是忘记记错账户。毕竟我们有很多朋友在某个商家注册很多账户,有时候自己都忘记是用哪个账户的。但是我们去找账户也不办...
LetBox此次促销依然是AMD Ryzen处理器+NVME硬盘+HDD大硬盘,以前是5TB月流量,现在免费升级到10TB月流量。另外还有返余额的活动,如果月付,月付多少返多少;如果季付或者半年付,返25%;如果年付,返10%。依然全部KVM虚拟化,可自定义ISO系统。需要大硬盘vps、大流量vps、便宜AMD VPS的朋友不要错过了。不过LetBox对帐号审核严格,最好注册邮箱和paypal帐号...