㈠ c小孩報數問題 急!!
請參考 http://..com/question/81617184.html?fr=ala0 有問題可以Hi我哈:) 這就是c語言的哈。 #include #include #include #define n 20 //定義小孩數量,暫定為20 #define m 5 //...報數 typedef struct monkey { int num; struct monkey *next; } Monkey,*LINK; void main() { LINK p,head,p2; int i; head=p=p2=(LINK)malloc(sizeof(Monkey));//三個指針指向同一塊內存 for(i=1;inext=p; p2=p; } p2->next=head;//把鏈表的首尾相連 p=head;//p指向了第一個結點 for(i=1;inum=i;//從第一個結點到最後一個結點依次給小孩編號 p=p->next; }//循環結束,p指向了最後一個結點 i=0; p=head;//再把p指向第一個結點 while(1) { i++; if(p->next==p) break;//此為while循環的出口 if(i==m)//if語句中是刪除結點的過程 { i=0; printf("%3d號小孩被淘汰 ",p->num); p2->next=p->next;//在此刪除結點p p=p2->next;//p指向它的下一個結點 continue; } else { if(i==m-1) p2=p;//保存將要退出結點的前一個結點(存到p2中) p=p->next; } } printf("勝出:%d號小孩",p->num);//最後剩下的結點就是獲勝的結點 getch(); }
㈡ c語言採用頭插法或尾插法建立鏈表,從鍵盤輸入遞增有序的數據建立 鏈表
void DeleteRepetedNode(PNode head)
{
int a[100]={0};
int i = 0,j;
int flag = 1;
PNode p,q,pre;
pre = head;
p = pre->next;
q = p->next;
while(p)
{
a[i++] = pre->data;
for(j=0;j<i;j++)
if(a[j]==p->data)
{
pre->next = q;
free(p);
p = q;
flag = 0;
break;
}
if(flag)
pre = p;
if(q&&p)
{
p = q;
q = q->next;
}
flag = 1;
}
}
㈢ 關於 C語言鏈表(linklist)
好象不是循環鏈表吧.....
pf=pb//這句是看你是否真正懂了整個創建過程,pb是指像當前最新創建的結點,而pf則指向上一個結點 每次從開始循環 pb指向新創建的結點 之後利用pf->next=pb來掛結點 而最後 pf指向pb 准備迎接下一個結點 當下一個結點來時
pb又指向新的結點 而pf 指向剛剛創建的結點 利用 pf->next=pb把pb掛在pf後面
pb->next=null 是在把新的結點的next域指定為空 也是一個初始化
malloc 是申請一塊內存空間來給新的結點 如果不去申請的話 新的結點放哪? 我們創建的東西都是憑空想像的 但是最後都要寫到計算機裡面 分配一塊內存空間大概就是這個意思
㈣ 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);
}
//這可是血汗錢啊.....