(1)在单链表数据结构上实现如下算法:已知一个元素值递增有序的单链表L(允许出现值重复的结点),设计算法删除值重复的结点。
(2) 在单链表数据结构上实现如下算法:已知一个带头结点的单链表,在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第K个位置上的结点(K为正整数)。若查找到,算法输出该结点的data域的值,并返回。
(3) 在单链表数据结构上实现如下算法:假设有两个元素值递增有序排列的线性表A和B,均以单链表存储,请编写算法,将A,B两个表归并为一个按元素值递减有序排列的线性表单链表C,要求利用原表(即A,B表)的结点空间。
(4) 在单链表数据结构上实现如下算法:编写算法,删除单链表L(L中元素值各不相同)的最大值所对应的结点,并返回改值。
#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;
}
//统计单链表的元素个数
int countlinklist(linklist h){
int i=0;
node *p;
p=h->next;
if(p==NULL){
printf("链表为空");
}
else
while(p!=NULL){
i++;
p=p->next;
}
return i;
}
//查找表中元素最大值,返回这个值
int searchmax(linklist h){
int max;
node *p;
p=h->next;
max=p->data;
while(p!=NULL){
if(p->data>max){
max=p->data;
}
p=p->next;
}
return max;
}
//按位置查找倒数第i个节点
linklist getlinkelem(linklist h,int i){
node *p;
p=h->next;
int k=1;
int n=countlinklist(h);
while(p!=NULL&&k<n-i+1){
p=p->next;
k++;
}
return p;
}
//连接两个单链表
void addlinklist(linklist h,linklist f){
node *p;
p=h->next;
while(p->next!=NULL){
p=p->next;
}
p->next=f->next;
free(f);
}
//删除表中最大值元素
int deletelinklistmax(linklist h){
int k=searchmax(h);
node *p,*q;
p=h;
q=p->next;
while(q!=NULL){
if(q->data==k){
p->next=q->next;
free(q);
q=p->next;
}
else{
p=p->next;
q=q->next;
}
}
return 0;
}
//删除表中重复元素
void deleterepeat(linklist h){
node *p,*q,*r;
p=h->next;
while(p!=NULL){
q=p;
while(q->next!=NULL){
if(q->next->data==p->data){
r=q->next;
q->next=r->next;
free(r);
}
else
q=q->next;
}
p=p->next;
}
}
//表的遍历
void outputlinklist(linklist h){
node *p;
p=h->next;
printf("H->");
while(p!=NULL){
printf("%d->",p->data);
p=p->next;
}
printf("NULL\n");
}
int main(){
linklist L,H;
char q;
node *p; int j;
while(q!='0'){
printf("请选择你要进行的操作:(退出请输入0;清屏请输入s)\n");
printf("1.删除链表中重复的元素: 2.查找倒数第k个位置上的节点\n");
printf("3.将La,Lb两个链表连接成Lc 4.删除单链表中的最大值\n");
printf("请输入要进行的操作:");
scanf("%s",&q);
switch(q){
case '0':break;
case '1':
initlinklist(&L);
createfromtail(L);
printf("创建的L链表为:");
outputlinklist(L);
deleterepeat(L);
printf("删除重复的元素后表为:");
outputlinklist(L); break;
case '2':
initlinklist(&L);
createfromtail(L);
printf("创建的链表为:");
outputlinklist(L);
printf("请输入你要查找的倒数第k个节点: ");
scanf("%d",&j);
p=getlinkelem(L,j);
printf("该节点data域的值为:%d\n",p->data);
break;
case '3':
initlinklist(&L);
createfromtail(L);
printf("创建的L链表为:");
outputlinklist(L);
initlinklist(&H);
createfromtail(H);
printf("创建的H链表为:");
outputlinklist(H);
printf("连接之后为:");
addlinklist(L,H);
outputlinklist(L);
break;
case '4':
initlinklist(&L);
createfromtail(L);
printf("创建的L链表为:");
outputlinklist(L);
deletelinklistmax(L);
printf("删除最大值后的表为:");
outputlinklist(L);
break;
case 's':system("cls");break;
default:printf("选择错误,请重新选择!\n");
break;
} }
return 0;
}
- 新手写的,可能不是最优解,但勉强解决了问题,如果感到对你有所帮助,点个赞吧!!!
祝你幸福!