(1) 定义单链表结构,并实现单链表的初始化(建空表),头插法建立单链表,尾插法建立单链表,单链表的清空(已有单链表置为空表),单链表的遍历(输出单链表)。
(2)在题目一的基础上实现如下算法:已知线性表中的元素(整数)以值递增有序排列,并以单链表作为存储结构。试写一高效算法,删除表中所有大于mink且小于maxk的元素(若表中存在这样的元素),注意mink和maxk是给定的两个参数,它们的值为任意整数。
(3)在题目一的基础上实现如下算法:实现单链表的就地逆置算法,即在原表的存储空间将线性表(a1,a2,…,an)逆置为(an,an-1,…,a1)
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int data;
struct node * next;
}node,*linklist;
//单链表的初始化
void initlinklist(linklist *h){
(*h)=(node*)malloc(sizeof(node));
(*h)->next=NULL;
}
//创建单链表
//头插法建立单链表
void cretefromhead(linklist h){
int e;
node *s;
int flag=1;
printf("输入表中的元素,输入-100结束!\n");
while(flag){
scanf("%d",&e);
if(e==-100)flag=0;
else{
s=(node*)malloc(sizeof(node));
s->data=e;
s->next=h->next;
h->next=s;
}
}
}
//尾插法建立单链表
void createfromtail(linklist h){
int e;
node *s,*p;
int flag=1;
p=h;
printf("输入表中的元素,输入-100结束!\n");
while (flag){
scanf("%d",&e);
if(e==-100)flag=0;
else
{
s=(node*)malloc(sizeof(node));
s->data=e;
p->next=s;
p=s;
}
}
p->next=NULL;
}
//单链表的查找
//按位置查找
linklist getlinkelem(linklist h,int i){
node *p;
p=h->next;
int k=1;
while(p!=NULL&&k<i){
p=p->next;
k++;
}
return p;
}
//按内容查找
linklist locatelinkelem(linklist h,int x,int y){
node *p;
p=h->next;
while((p!=NULL&&p->data<x)||(p!=NULL&&p->data>y))
p=p->next;
return p;
}
//统计链表中元素出现的次数
int tongji(linklist h,int x,int y){
node*p;int i=0;
p=h->next;
while(p!=NULL){
if((p!=NULL&&p->data>x&&p->data<y)){
i++;}
p=p->next;
} return i;
}
//插入元素
//按位置插入
int insertlinklist(linklist h,int i,int e){
node *s,*p;
p= getlinkelem(h,i);
if(p==NULL){
printf("这个位置无法插入");
return 0;}
else{
s=(node*)malloc(sizeof(node));
s->data=e;
s->next=p->next;
p->next=s;
return 0;
}
}
//删除元素
//按位置删除
int deletelinklist(linklist h,int i){
node *s,*p;
p=getlinkelem(h,i);
if(p==NULL)return 0;
s=p->next;
p->next=s->next;
free(s);
return 0;
}
//按内容删除
int deletelinklists(linklist h,int x,int y){
if(h==NULL){
printf("链表为空");
return 0;
}
node *p,*q;
p=h;
q=p->next;
while(q!=NULL){
if(q->data>x&&q->data<y){
p->next=q->next;
free(q);
q=p->next;
}
else{
p=p->next;
q=q->next;
}
}
if(h!= NULL && h->data>x&&h->data<y)
{
q = h;
h = q->next;
free(q);
return 0;
}
return 0;
}
//表的遍历
void outputlinklist(linklist h){
node *p;
p=h->next;
printf("H->");
while(p!=NULL){
printf("%d->",p->data);
p=p->next;
}
printf("NULL\n");
}
//表的逆置
void reverselist(linklist h){
node *p,*q,*x;
p=h->next;
h->next=NULL;
while(p!=NULL){
q=p;
p=p->next;
q->next=h->next;
h->next=q;
}
x=h->next;
if(x==NULL)
printf("链表为空");
else
printf("H->");
while(x!=NULL){
printf("%d->",x->data);
x=x->next;
}
printf("->NULL\n");
}
下面为主函数:
int main(){
linklist L;
char q;
int t,x,y;
while(q!='0'){
printf("请选择你要进行的操作:(退出请输入0;清屏请输入s)\n");
printf("1.定义单链表并遍历 2.删除单链表中介于x与y之间的值\n");
printf("3.将单链表逆置 \n");
printf("请输入要进行的操作:");
scanf("%s",&q);
switch(q){
case '0':break;
case '1':initlinklist(&L);
createfromtail(L);
outputlinklist(L); break;
case '2':initlinklist(&L);
createfromtail(L);
printf("原单链表为:");
outputlinklist(L);
printf("请输入你需要删除的边界大小:");
scanf("%d %d",&x,&y);
deletelinklists(L,x,y);
printf("删除后的单链表为:");
outputlinklist(L);
break;
case '3':initlinklist(&L);
createfromtail(L);
printf("原单链表为:");
outputlinklist(L);
printf("逆置之后的表为:");
reverselist(L);
break;
case 's':system("cls");break;
default:printf("选择错误,请重新选择!\n");
break;
} }
return 0;
}
- 新手写的,可能不是最优解,但勉强解决了问题,如果感到对你有所帮助,点个赞吧!!!
祝你幸福!