㈠ 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);
}
//这可是血汗钱啊.....