实验1
编写函数slnklist delx(linklist head, datatype x),删除不带头结点单链表head中第一个值为x 的结点。
并构造测试用例进行测试。
并构造测试用例进行测试。
#include "slnklist.h"
/*请将本函数补充完整,并进行测试*/
linklist delx(linklist head,datatype x)
{
linklist pre=NULL,p,q;
p=head;
while(p&&p->info!=x){ pre=p;p=p->next; } // 找到第一个x的位置;
if(p){
if(!pre) head=head->next; // 第一个数就是要删除的x;
else pre->next=p->next; // 不在第一个数;
free(p);
}
return head;
}
int main()
{ datatype x;
linklist head;
head=creatbyqueue(); /*尾插入法建立单链表*/
print(head);
printf("请输入要删除的值:");
scanf("%d",&x);
head=delx(head,x); /*删除单链表的第一个值为x的结点*/
print(head);
delList(head); /*释放单链表空间*/
return 0;
}
实验2
假设线性表(a1,a2,a3,…an)采用不带头结点的单链表存储,请设计算法函数linklist reverse1(linklist head)和
void reverse2(linklist *head)将不带头结点的单链表head就地倒置,使表变成(an,an-1,…a3.a2,a1)。并构造测试用例进行测试。
void reverse2(linklist *head)将不带头结点的单链表head就地倒置,使表变成(an,an-1,…a3.a2,a1)。并构造测试用例进行测试。
#include "slnklist.h"
/*请将本函数补充完整,并进行测试*/
linklist reverse1(linklist head)
{
linklist newH,q,p;
p=head;
newH=NULL;
while(p!=NULL){ // 两次头插法,便改变一次顺序;
q=p; p=p->next;
q->next=newH;
newH=q;
}
return newH;
}
void reverse2(linklist *head)
{
linklist p=NULL,q=*head;
while(q!=NULL){
*head=q->next; // 保留下一个结点;
q->next=p;
p=q;
q=*head; // 移动到下一个结点;
}
*head=p; // 指向逆置后的头结点;
}
int main()
{ datatype x;
linklist head;
head=creatbystack(); /*头插入法建立单链表*/
print(head); /*输出原链表*/
head= reverse1(head); /*倒置单链表*/
print(head); /*输出倒置后的链表*/
reverse2(&head); /*倒置单链表*/
print(head);
delList(head);
return 0;
}
实验3
假设不带头结点的单链表head是升序排列的,设计算法函数linklist insert(linklist head,datatype x),将值为x的结点插入到链表head中,并保持链表有序性。
分别构造插入到表头、表中和表尾三种情况的测试用例进行测试。
分别构造插入到表头、表中和表尾三种情况的测试用例进行测试。
/**********************************/
/*文件名称:lab2_03.c */
/**********************************/
#include "slnklist.h"
/*请将本函数补充完整,并进行测试*/
linklist insert(linklist head ,datatype x)
{
linklist pre=NULL,h=head,p;
while(h&&h->info<x){
pre=h;
h=h->next;
}
p=(node*)malloc(sizeof(node));
p->info=x;
if(pre==NULL){ // 第一种情况,表头;
p->next=head;
head=p;
}else if(h){ // 第一种情况,表中;
p->next=pre->next;
pre->next=p;
}else if(!h){ // 第一种情况,表尾;
p->next=NULL;
pre->next=p;
}
return head;
}
int main()
{ datatype x;
linklist head;
printf("输入一组升序排列的整数:\n");
head=creatbyqueue(); /*尾插入法建立单链表*/
print(head);
printf("请输入要插入的值:");
scanf("%d",&x);
head=insert(head,x); /*将输入的值插入到单链表适当位置*/
print(head);
delList(head);
return 0;
}
实验4
编写算法函数linklist delallx(linklist head, int x),删除不带头结点单链表head中所有值为x的结点。
/**********************************/
/*文件名称:lab2_04.c */
/**********************************/
#include "slnklist.h"
/*请将本函数补充完整,并进行测试*/
linklist delallx(linklist head,int x)
{
linklist pre=NULL,p;
if(!head){
printf("单链表是空的");
return head;
}
p=head;
do{
while(p&&p->info!=x){ // 查找第一个x;
pre=p;p=p->next;
}
if(p){
if(!pre) head=head->next,pre=NULL; // 如果第一个x是在表头,要将pre重新赋为NULL;
else pre->next=p->next;
}
p=p->next; // 从删除的位置的下一个开始查找;
}while(p);
return head;
}
int main()
{ datatype x;
linklist head;
head=creatbyqueue(); /*尾插入法建立单链表*/
print(head);
printf("请输入要删除的值:");
scanf("%d",&x);
head=delallx(head,x);
print(head);
delList(head);
return 0;
}