/*编写函数slnklist delx(linklist head, datatype x),删除不带头结点单链表head中第一个值为x 的结点。
并构造测试用例进行测试。
*/
/**********************************/
/*文件名称:lab2_01.c */
/**********************************/
#include "slnklist.h"
/*请将本函数补充完整,并进行测试*/
linklist delx(linklist head,datatype x)
{
linklist p = head,pre=NULL;//一定要初始化pre=NULL
while(p&&p->info!=x)
{
pre = p;
p = p->next;
}
if(p)
{
if(!pre)
{
head = head->next;
}
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;
}
/**********************************/
/*文件名称:lab2_02.c */
/**********************************/
/*
假设线性表(a1,a2,a3,…an)采用不带头结点的单链表存储,
请设计算法函数linklist reverse1(linklist head)和
void reverse2(linklist *head)将不带头结点的单链表head就地倒置,
使表变成(an,an-1,…a3.a2,a1)。并构造测试用例进行测试。
*/
#include "slnklist.h"
/*请将本函数补充完整,并进行测试*/
linklist reverse1(linklist head)
{
linklist p,q;
p=head;
head = NULL;
while(p) //核心
{
q = p->next;
p->next = head;
head=p;
p=q;
}
return head;
}
void reverse2(linklist *head) //不返回值,那就从指针上下手
{
linklist p,q;
p=*head;
*head = NULL;
while(p)
{
q = p->next;
p->next = *head;
*head=p;
p=q;
}
}
int main()
{ datatype x;
linklist head;
head=creatbystack(); /*头插入法建立单链表*/
print(head); /*输出原链表*/
head= reverse1(head); /*倒置单链表*/
print(head); /*输出倒置后的链表*/
reverse2(&head); /*倒置单链表*/
print(head);
delList(head);
return 0;
}
/*
假设不带头结点的单链表head是升序排列的,设计算法函数linklist insert(linklist head,datatype x),
将值为x的结点插入到链表head中,并保持链表有序性。
分别构造插入到表头、表中和表尾三种情况的测试用例进行测试。
*/
/**********************************/
/*文件名称:lab2_03.c */
/**********************************/
#include "slnklist.h"
/*请将本函数补充完整,并进行测试*/
linklist insert(linklist head ,datatype x)
{
linklist pre,p,s;
s = (linklist)malloc(sizeof(node));
s->info = x;
p = head;
pre=NULL;
while(p&&p->infonext;
}
if(!pre) //插在表头
{
s->next = head;
head = s;
}else{ //插在中间或者末尾
pre->next = s;
s->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;
}
/*
编写算法函数linklist delallx(linklist head, int x),删除不带头结点单链表head中所有值为x的结点。
*/
/**********************************/
/*文件名称:lab2_04.c */
/**********************************/
#include "slnklist.h"
/*请将本函数补充完整,并进行测试*/
linklist delallx(linklist head,int x)
{
linklist p,t;
while(head)//如果要删除的是第一个
{
if(head->info==x)
{
p=head;
head=head->next;
free(p);//回收p
} else {
break;
}
}
if(head)//如果删除的不是第一个
{
p=head;
while(p->next)
{
if(p->next->info==x)
{
t=p->next;
p->next=p->next->next;
free(t);
} else {
p=p->next;
}
}
}
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;
}
slnklist.h
#include <stdio.h>
/**************************************/
/* 链表实现的头文件,文件名slnklist.h */
/**************************************/
typedef int datatype;
typedef struct link_node{
datatype info;
struct link_node *next;
}node;
typedef node *linklist;
/**********************************/
/*函数名称:creatbystack() */
/*函数功能:头插法建立单链表 */
/**********************************/
linklist creatbystack()
{ linklist head,s;
datatype x;
head=NULL;
printf("请输入若干整数序列:\n");
scanf("%d",&x);
while (x!=0) /*以0结束输入*/
{ s=(linklist)malloc(sizeof(node)); /*生成待插入结点*/
s->info=x;
s->next=head; /*将新结点插入到链表最前面*/
head=s;
scanf("%d",&x);
}
return head; /*返回建立的单链表*/
}
/**********************************/
/*函数名称:creatbyqueue() */
/*函数功能:尾插法建立单链表 */
/**********************************/
linklist creatbyqueue()
{
linklist head,r,s;
datatype x;
head=r=NULL;
printf("请输入若干整数序列:\n");
scanf("%d",&x);
while (x!=0) /*以0结束输入*/
{ s=(linklist)malloc(sizeof(node));
s->info=x;
if (head==NULL) /*将新结点插入到链表最后面*/
head=s;
else
r->next=s;
r=s;
scanf("%d",&x);
}
if (r) r->next=NULL;
return head; /*返回建立的单链表*/
}
/**********************************/
/*函数名称:print() */
/*函数功能:输出不带头结点的单链表 */
/**********************************/
void print(linklist head)
{ linklist p;
int i=0;
p=head;
printf("List is:\n");
while(p)
{
printf("%5d",p->info);
p=p->next;
i++;
if (i%10==0) printf("\n");
}
printf("\n");
}
/**********************************/
/*函数名称:delList() */
/*函数功能:释放不带头结点的单链表 */
/**********************************/
void delList(linklist head)
{ linklist p=head;
while (p)
{ head=p->next;
free(p);
p=head;
}
}
本文地址:http://liuyanzhao.com/3600.html
转载请注明