当前位置:首页 » 编程语言 » c语言实现tail指令
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言实现tail指令

发布时间: 2023-08-12 14:37:20

c语言采用头插法或尾插法建立链表,从键盘输入递增有序的数据建立链表

#include<stdio.h>
#include<stdlib.h>
/*定义链表结点*/
typedefstructst_node{
intvalue;
structst_node*next;
}node_t;
/*定义链表*/
typedefstruct{
node_thead;
node_t*tail;
}list_t;
/*插入到队列尾部*/
voidlist_push_back(list_t*l,intvalue){
node_t*t=(node_t*)malloc(sizeof(node_t));
t->value=value;
t->next=NULL;

l->tail->next=t;
l->tail=t;
}
/*有序地插入元素*/
voidlist_push_sort(list_t*l,intvalue){
/*找出小于或等于value的节点,插入到该节点前面*/
node_t*p=l->head.next,*last=&l->head,*t;
for(;p;last=p,p=p->next){
if(value<=p->value){
t=(node_t*)malloc(sizeof(node_t));
t->value=value;
t->next=p;

last->next=t;
return;
}
}
/*如果没有小于或等于value的节点,则直接插入到末尾*/
list_push_back(l,value);
}
/*使用数组初始化有序链表*/
voidlist_init(list_t*l,int*p,ints){
inti=0;
l->head.next=NULL;
l->tail=&l->head;
for(;i<s;++i){
list_push_sort(l,p[i]);
}
}
/*清空链表*/
voidlist_clear(list_t*l){
node_t*p=l->head.next,*t;
while(p){
t=p;
p=p->next;
free(t);
}
l->head.next=NULL;
l->tail=&l->head;
}
/*合并有序链表*/
voidlist_merge(list_t*l,list_t*r,list_t*o){
node_t*pl=l->head.next,*pr=r->head.next;
while(pl||pr){
if(pl&&pr){
if(pl->value<=pr->value){
list_push_back(o,pl->value);
pl=pl->next;
}else{
list_push_back(o,pr->value);
pr=pr->next;
}
}elseif(pl){
list_push_back(o,pl->value);
pl=pl->next;
}else{
list_push_back(o,pr->value);
pr=pr->next;
}
}
}
/*删除相同结点*/
voidlist_plicate_delete(list_t*l){
if(&l->head!=l->tail){
node_t*p=l->head.next,*last,*t;
intvalue=p->value;

last=p;
p=p->next;
while(p){
if(value==p->value){
t=p;
last->next=p->next;
p=p->next;
free(t);
}else{
value=p->value;
last=p;
p=p->next;
}
}
}
}
/*打印链表*/
voidlist_show(char*name,list_t*l){
node_t*p=l->head.next;
printf("%s:",name);
for(;p;p=p->next){
printf("%d,",p->value);
}
printf(" ");
}
/*主函数*/
voidmain(){
list_tlist1,list2,list3;
inta[]={10,4,6,12,1,8,14,10,14,6};
intb[]={7,11,6,1,13,5,1,14};

/*所有链表需要初始化后才能使用*/
list_init(&list1,a,sizeof(a)/sizeof(int));
list_init(&list2,b,sizeof(b)/sizeof(int));
list_init(&list3,NULL,0);

printf("初始值: ");
list_show("List1",&list1);
list_show("List2",&list2);
list_show("List3",&list3);

/*合并链表*/
list_merge(&list1,&list2,&list3);
printf("合并后: ");
list_show("List1",&list1);
list_show("List2",&list2);
list_show("List3",&list3);

/*去重复*/
list_plicate_delete(&list3);
printf("去重复后: ");
list_show("List1",&list1);
list_show("List2",&list2);
list_show("List3",&list3);

/*所有链表都需要释放空间*/
list_clear(&list1);
list_clear(&list2);
list_clear(&list3);
}

//这可是血汗钱啊.....

❷ 用c语言实现约瑟夫环

正好之前写过基础的约瑟夫环,稍作修改就可以满足你的题目

#include<stdio.h>
#include<stdlib.h>

typedefstruct_node{
intid;
intkey;
struct_node*next;
}Linklist;

intmain(){
intn,m;
scanf("%d%d",&n,&m);
inti,count=0;
Linklist*head=(Linklist*)malloc(sizeof(Linklist)),*tail=head;
head->id=1;
scanf("%d",&head->key);
head->next=head;
for(i=2;i<=n;i++){
Linklist*p=(Linklist*)malloc(sizeof(Linklist));
p->id=i;
scanf("%d",&p->key);
p->next=head;
tail->next=p;
tail=p;
}
while(head!=tail){
if(++count%m){
tail=head;
}else{
m=head->key;
count=0;
printf("%d",head->id);
tail->next=head->next;
free(head);
}
head=tail->next;
}
printf("%d ",head->id);
free(head);
return0;
}

❸ c语言结构体那块的队列问题。我们书上没有,是能给我讲讲。把我讲懂我给加分

你好,队列用简单的话讲就是一个数组,这个数组是先进先出的。
队列包含两个属性,一个叫head,head指向队头,另一个叫tail,tail 指向当前的队尾。
举个例子:用一个数组q[1...n]来表示一个队列,里面最多放n-1个元素,各元素的位置为:head,head+1,...,tail-1,在最后一个位置要进行圈绕,即让队列中的n个元素排成环形,位置1刚好在位置n的后面。
开始时候head=tail=1,因为没有元素,都指向q[1],然后是入队操作,入队操作直接往“队尾”添加元素即可,将插入的元素赋值给q[tail],然后看tail是不是已经到数组的末尾位置了,如果到了,tail=1(实现了环形数组),如果没有到,那么tail=tail+1,入队结束。删除操作是直接从“队头”删除,找到q[head],将其值取出赋值给一个变量比如说x,然后看head是不是已经到数组的末尾位置了,如果到了,head=1(实现了环形数组),如果没有到,那么head=head+1,出队结束。判队列是否为空操作,就看head是否等于tail,等于就是空的。最后,注意当队列为空时,试图删除一个元素,就会导致队列下溢,应该在删除前先判定队列是否为空。如果head=tail+1时(因为是环形),队列满,此时添加元素会溢出,应该在添加操作前判定。