【循环单链表算法】设一个带头结点的非空循环单链表 L,结点的值可能重复。
设计一个算法在 L 中第一个最大值结点(最大值结点可能有多个)之前那插入一
个值为想的结点
源程序:
#include<stdio.h>
#include<malloc.h>
typedef struct node{
int data;
struct node* next;
}node;
node *creat(int length){ // 创建循环单链表
node *p;
printf("Input %d data:",length);
int n;
if(length<1)
return NULL;
node* head=(node*)malloc(sizeof(node));
head->next=NULL;
int i=1;
node* temp=head;
while(i<=length){
p=(node*)malloc(sizeof(node));
scanf_s("%d",&n);
p->data=n;
temp->next=p;
temp=p;
i++;
}
temp->next=head->next; // 唯一和单链表创建有区别的地方
return head;
}
void print(node*L,int n){ // 输出链表元素
node*p=L->next;
if(p==NULL){
printf("链表元素为空!");
return ;
}
int i;
for(i=0;i<n;i++){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
int find(node*L,int n){ // 找到最大值结点所在的位置并返回
node *p=L->next;
int max=p->data; //把链表第一个节点元素赋予max
int i,j=0;
for(i=1;i<n;i++){
if(max<p->next->data){
max=p->next->data;
j=i; // 遍历,找到大于max的值就把该值赋予max
}
p=p->next;
}
return j;
}
void insert(node*L,int m,int n){ // 在最大值结点前插入结点
int a;
int i=0;
node*q=(node*)malloc(sizeof(node)); // 赋予空间
node*p=L->next;
if(m==0){ // 判断最大值所在的位置是为为第一个节点,是的话遍历到最后一个节点便在其后插入结点
while(i<n-1){
p=p->next;
i++;
}
printf("Input data:");
scanf("%d",&a);
q->data=a;
q->next=p->next;
p->next=q;
}
else{ // 最大值节点所在位置不是第一个节点的话,找到该节点并在其前插入结点
while(i<m-1){
p=p->next;
i++;
}
printf("Input insert data:");
scanf("%d",&a);
q->data=a;
q->next=p->next;
p->next=q;
}
}
int main(){
node* L;
int m,n;
printf("Input n:");
scanf("%d",&n);
L=creat(n);
print(L,n);
m=find(L,n);
printf("Max at %d \n",m+1);
insert(L,m,n);
print(L,n+1);
}
关键函数的流程图就不放了,有需要的可以留言