《数据结构》实验报告
实验序号 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;
CheapWindowsVPS是一家成立于2007年的老牌国外主机商,顾名思义,一个提供便宜的Windows系统VPS主机(同样也支持安装Linux系列的哈)的商家,可选数据中心包括美国洛杉矶、达拉斯、芝加哥、纽约、英国伦敦、法国、新加坡等等,目前商家针对VPS主机推出5折优惠码,优惠后最低4GB内存套餐月付仅4.5美元。下面列出几款VPS主机配置信息。CPU:2cores内存:4GB硬盘:60G...
美得云成立于2021年,是一家云产品管理服务商(cloud)专业提供云计算服务、DDOS防护、网络安全服务、国内海外数据中心托管租用等业务、20000+用户的选择,43800+小时稳定运行香港特价将军澳CTG+CN2云服务器、采用高端CPU 优质CN2路线 SDD硬盘。香港CTG+CN22核2G3M20G数据盘25元点击购买香港CTG+CN22核2G5M30G数据盘39元点击购买香港CTG+CN...
SpinServers服务商也不算是老牌的服务商,商家看介绍是是2018年成立的主机品牌,隶属于Majestic Hosting Solutions LLC旗下。商家主要经营独立服务器租用和Hybrid Dedicated服务器等,目前包含的数据中心在美国达拉斯、圣何塞机房,自有硬件和IP资源等,商家还自定义支持用户IP广播到机房。看到SpinServers推出了美国独服的夏季优惠促销活动,最低月...