❶ 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時(因為是環形),隊列滿,此時添加元素會溢出,應該在添加操作前判定。