C 练习实例73
题目:反向输出一个链表。
程序分析:无。
实例
// Created by www.runoob.com on 15/11/9.
// Copyright © 2015年 菜鸟教程. All rights reserved.
//
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
LinkList CreateList(int n);
void print(LinkList h);
int main()
{
LinkList Head=NULL;
int n;
scanf("%d",&n);
Head=CreateList(n);
printf("刚刚建立的各个链表元素的值为:\n");
print(Head);
printf("\n\n");
system("pause");
return 0;
}
LinkList CreateList(int n)
{
LinkList L,p,q;
int i;
L=(LNode*)malloc(sizeof(LNode));
if(!L)return 0;
L->next=NULL;
q=L;
for(i=1;i<=n;i++)
{
p=(LinkList)malloc(sizeof(LNode));
printf("请输入第%d个元素的值:",i);
scanf("%d",&(p->data));
p->next=NULL;
q->next=p;
q=p;
}
return L;
}
void print(LinkList h)
{
LinkList p=h->next;
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
}
C 语言经典100例
banhuxun
ban***un@163.com
结合上个练习
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct LNode { int data; struct LNode *next; }L; L *creat_node(int data); void print_list(L *pH); void tail_insert(L *pH,L *new); void trave_list(L *pH); void top_insert(L *pH,L *new); int main() { int i,n,j; L *head=creat_node(0); printf("请输入想要创建节点的个数:"); scanf("%d",&n); for(i=1;i<=n;i++) { printf("第%d个节点的数据:",i); scanf("%d",&j); tail_insert(head,creat_node(j)); } printf("***************************\n"); printf("刚刚创建的链表:\n"); print_list(head); trave_list(head); printf("***************************\n"); printf("反向输出的链表:\n"); print_list(head); return 0; } //创建节点 L *creat_node(int data) { L *p=malloc(sizeof(L)); if(NULL==p) { printf("malloc error!\n"); return NULL; } memset(p,0,sizeof(L)); p->data=data; p->next=NULL; return p; } //尾插法 void tail_insert(L *pH,L *new) { L *p=pH; while(NULL!=p->next) { p=p->next; } p->next=new; } //打印链表 void print_list(L *pH) { L *p=pH; while(NULL!=p->next) { p=p->next; printf("data=%d\n",p->data); } } //反向输出链表 void trave_list(L *pH) { L *p=pH->next; L *pBack; while(NULL!=p->next) { pBack=p->next; if(p==pH->next) { p->next=NULL; } else { p->next=pH->next; } pH->next=p; p=pBack; } top_insert(pH,p); } //头插法 void top_insert(L *pH,L *new) { L *p=pH; new->next=pH->next; pH->next=new; }输出结果
banhuxun
ban***un@163.com
钱文欢
qia***ishangdi@sina.com
链表缓冲区读写例子
#include <stdio.h> #include <string.h> typedef struct LNode{ int data[5]; int status; struct LNode *next; }LNode, *LinkList; typedef struct LList{ LNode LNode[10]; LinkList read; LinkList write; }LList_Example; void read_task(LList_Example *lle) { if(lle->read->status == 1){ printf("read data: %d\r\n",lle->read->data[0]); lle->read->status = 0; lle->read = lle->read->next; } else { printf("read have catch up with write\r\n"); //读追上写,放弃本次读操作 } } void write_task(LList_Example *lle) { static int i; if(lle->write->status == 0){ lle->write->data[0] = i; lle->write->status = 1; i++; printf("write data: %d\r\n",lle->write->data[0]); lle->write = lle->write->next; } else { printf("write have catch up with read\r\n"); //写追上读,可以选择覆盖或者丢弃 } } int main() { int i,j; LList_Example le_0; memset(&le_0, 0x00, sizeof(le_0)); for(i=0;i<9;i++){ le_0.LNode[i].next = &le_0.LNode[i+1]; } le_0.LNode[i].next = &le_0.LNode[0]; le_0.write = &le_0.LNode[0]; le_0.read = &le_0.LNode[0]; for(i=0;i<5;i++){ le_0.write->data[0] = i; le_0.write->status = 1; le_0.write = le_0.write->next; printf("write data: %d\r\n",le_0.LNode[i].data[0]); } for(i=0;i<22;i++){ for(j=0;j<10;j++){ printf("%d:%d, ",j,le_0.LNode[j].status); } printf("\r\n"); read_task(&le_0);//增加read_task使读快于写 write_task(&le_0);//增加write_task使写快于读 } return 0; }钱文欢
qia***ishangdi@sina.com
HIT_CCC
117***2963@qq.com
原地逆置单链表,空间复杂度O(1)。
Linklist reverse(Linklist L) { Linklist prep, p , q; p = L->next; q = p->next; p->next = NULL; while(q) { prep = p; p = q; q= q->next; p->next = prep; } L->next = p; return L; }HIT_CCC
117***2963@qq.com
fire_atom
yfa***086@hotmail.com
题解没有给出反转链表的逻辑,这里补充一下:
#include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct LNode { int data; struct LNode *next; } LNode, *LinkList; LinkList CreateList(int n); void PrintList(LinkList h); void ReverseList(LinkList h); int main() { LinkList Head = NULL; int n; scanf("%d", &n); Head = CreateList(n); printf("value of this linkedlist is: \n"); PrintList(Head); printf("\n\n"); printf("reverse list: \n"); ReverseList(Head); PrintList(Head); } void ReverseList(LinkList h) { LinkList pre = NULL; LinkList cur = h->next; LinkList temp; while (cur) { temp = cur->next; cur->next = pre; pre = cur; cur = temp; } h->next = pre; } LinkList CreateList(int n) { LinkList l, p, q; l = (LinkList) malloc(sizeof(LNode)); if (!l) return 0; l->next = NULL; q = l; for (int i = 0; i < n; i++) { p = (LinkList) malloc(sizeof(LNode)); p->data = i; p->next = NULL; q->next = p; q = p; } return l; } void PrintList(LinkList h) { LinkList p = h->next; while (p != NULL) { printf("%d ", p->data); p = p->next; } }fire_atom
yfa***086@hotmail.com