急求啊,写一个200行的C语言程序,什么都可以,带解释,哪位大神帮帮忙

如题所述

#include <stdio.h>

#define OK 1   
#define ERROR 0
#define TRUE 1   
#define FALSE 0

#define MAXSIZE 100

#define LElemType int
#define Status int
#define BOOL int

typedef struct
{
 LElemType data;
 int cur;
}Component,SLinkList[MAXSIZE];

int Malloc(SLinkList space) 

 //若备用链表非空,则返回分配的结点下标(备用链表的第一个结点),否则返回0
 int i=space[0].cur;
 if (i)
  space[0].cur=space[i].cur;
 return i;
}

Status Free(SLinkList space, int k) 

 //将下标为空的空闲结点回收到备用链表(成为备用链表的第一个结点)
 space[k].cur=space[0].cur;
 space[0].cur=k;
 return OK;
}

Status InitList(SLinkList L)

 //构造一个空的链表L,表头为L的最后一个单元L[MAXSIZE-1],其余单元链成
 //一个备用链表,表头为L的第一个单元L[0],“0”表示空指针
 int i;
 L[MAXSIZE-1].cur=0;
 for (i=0;i<MAXSIZE-2;i++)
  L[i].cur=i+1;
 L[MAXSIZE-2].cur=0;
 return OK;
}

Status ClearList(SLinkList L)

 //初始条件:线性表L已存在。操作结果:将L重置为空表
 int i,j,k;
 i=L[MAXSIZE-1].cur;
 L[MAXSIZE-1].cur=0;
 k=L[0].cur;
 L[0].cur=i;
 while (i)
 {
  j=i;
  i=L[i].cur;
 }
 L[j].cur=k;
 return OK;
}

BOOL ListEmpty(SLinkList L)

 //若L是空表,返回TRUE;否则返回FALSE
 if (!L[MAXSIZE-1].cur)
  return TRUE;
 else
  return FALSE;
}

int ListLength(SLinkList L)

 //返回L中数据元素个数
 int i,len;
 i=L[MAXSIZE-1].cur;
 len=0;
 while (i)
 {
  i=L[i].cur;
  len++;
 }
 return len;
}

Status GetElem(SLinkList L,int i,LElemType *e)

 //用e返回L中第i个元素的值
 int j,k=MAXSIZE-1;
 if (i<1||i>ListLength(L))
  return ERROR;
 for (j=1;j<=i;j++)
  k=L[k].cur;
 *e=L[k].data;
 return OK;
}

int LocateElem(SLinkList L,LElemType e) 

 //在静态单链线性表L中查找第1个值为e的元素。若找到,则返回它在L中的
 //位序,否则返回0。(与其它LocateElem()的定义不同)
 int i=L[MAXSIZE-1].cur;
 while (i&&L[i].data!=e)
  i=L[i].cur;
 return i;
}

Status PriorElem(SLinkList L,LElemType cur_e,LElemType *pre_e)

 //初始条件:线性表L已存在
 //操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,
 //          否则操作失败,pre_e无定义
 int i,j;
 i=L[MAXSIZE-1].cur; 
 do{
  j=i;
  i=L[i].cur;
 }while (i&&L[i].data!=cur_e);
 if (i)
 {
  *pre_e=L[j].data;
  return OK;
 }
 return ERROR;
}

Status NextElem(SLinkList L,LElemType cur_e,LElemType *next_e)

 //初始条件:线性表L已存在
 //操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,
 //          否则操作失败,next_e无定义
 int i,j;
 i=LocateElem(L,cur_e);
 if (i)
 {
  j=L[i].cur;
  if (j)
  {
   *next_e=L[j].data;
   return OK;
  }
 }
 return ERROR;
}

Status ListInsert(SLinkList L,int i,LElemType e)

 //在L中第i个元素之前插入新的数据元素e
 int j,k,l;
 k=MAXSIZE-1;
 if (i<1||i>ListLength(L)+1)
  return ERROR;
 j=Malloc(L);
 if (j)
 {
  L[j].data=e;
  for(l=1;l<=i-1;l++)
   k=L[k].cur;
  L[j].cur=L[k].cur;
  L[k].cur=j;
  return OK;
 }
 return ERROR;
}

Status ListDelete(SLinkList L,int i,LElemType *e)
{
 //删除在L中第i个数据元素e,并返回其值
 int j,k;
 if (i<1||i>ListLength(L))
  return ERROR;
 k=MAXSIZE-1;
 for (j=1;j<=i-1;j++)
  k=L[k].cur;
 j=L[k].cur;
 L[k].cur=L[j].cur;
 *e=L[j].data;
 Free(L,j);
 return OK;
}

Status ListTraverse(SLinkList L,void (* visit)(LElemType e))

 int i=L[MAXSIZE-1].cur;
 while (i)
 {
  visit(L[i].data);
  i=L[i].cur;
 }
 return OK;
}

void Visit(LElemType e)
{
 printf("%d\n",e);
}

int main()
{
 int i,j,k;
 LElemType e,e0;
 SLinkList L;
 InitList(L);
 for(j=1;j<=5;j++)
  i=ListInsert(L,1,j);
 ListTraverse(L,Visit);
 //判断链表是否为空
 i=ListEmpty(L);
 printf("%d\n",i);
 //打印链表长度
 printf("%d\n",ListLength(L));
 //清空静态链表
 ClearList(L);
 ListTraverse(L,Visit);
 for(j=1;j<=10;j++)
  ListInsert(L,j,j);
 //插入新节点后
 ListTraverse(L,Visit);
 //获取链表中的第5个元素
 GetElem(L,5,&e);
 printf("%d\n",e);
 for(j=0;j<=1;j++)
 {
  k=LocateElem(L,j);
  if(k)
   printf("%d %d\n",j,k);//j在链表中的序号k
  else
   printf("Can't find %d\n",j);//链表中不存在j
 }
 for(j=1;j<=2;j++) //测试头两个数据
 {
  GetElem(L,j,&e0); //把第j个数据赋给e0
  i=PriorElem(L,e0,&e); //求e0的前驱
  if(!i)
   printf("No elem before %d\n",e0);
  else
   printf("Elem before %d is %d\n",e0,e);//数据e0的前驱
 }
 for(j=ListLength(L)-1;j<=ListLength(L);j++) //最后两个数据
 {
  GetElem(L,j,&e0); //把第j个数据赋给e0
  i=NextElem(L,e0,&e); //求e0的后继
  if(!i)
   printf("No elem after %d\n",e0);
  else
   printf("The elem after % is %d\n",e0,e);//数据e0的后继
 }
 k=ListLength(L); //k为表长
 for(j=k+1;j>=k;j--)
 {
  i=ListDelete(L,j,&e); //删除第j个数据
  if(i)
   printf("Delete Succussfully\n");
  else
   printf("Can't find the elem\n",j);
 }
 ListTraverse(L,Visit);
 return 0;
}

给你找了个静态链表的代码,能编译运行

追问

大神,灰常感谢啊,麻烦能不能说一下这个程序的目的和思路啊,要交报告的

追答

自行百度静态链表吧,这个太烦了,说不清楚

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-06-30
View Code
# include<stdio.h>
# include<string.h>
# define N 1005
# define M 2005
struct node{
int from,to,next;
}edge1[M],edge2[M];
int visit1[N],visit2[N],head1[N],head2[N],T[N];
int in_degree[N],out_degree[N],tol1,tol2,Bcnt,Tcnt;
int val[N],v1[N],min,Belong[N];
void add(int a,int b)
{
edge1[tol1].from=a;edge1[tol1].to=b;edge1[tol1].next=head1[a];head1[a]=tol1++;
edge2[tol2].from=b;edge2[tol2].to=a;edge2[tol2].next=head2[b];head2[b]=tol2++;
}
void dfs1(int x)
{
int i;
visit1[x]=1;
for(i=head1[x];i!=-1;i=edge1[i].next)
if(visit1[edge1[i].to]==0) dfs1(edge1[i].to);
T[Tcnt++]=x;
}
void dfs2(int x)
{
int i;
Belong[x]=Bcnt;
if(val[x]<min) min=val[x];
visit2[x]=1;
for(i=head2[x];i!=-1;i=edge2[i].next)
if(visit2[edge2[i].to]==0) dfs2(edge2[i].to);
}
int main()
{
int i,n,m,sum,x,y,a,b,count;
while(scanf("%d%d",&n,&m)!=EOF)
{
tol1=tol2=0;
Bcnt=Tcnt=0;
for(i=1;i<=n;i++)
{
head1[i]=-1;
head2[i]=-1;
visit1[i]=0;
visit2[i]=0;
scanf("%d",&val[i]);
}
while(m--)
{
scanf("%d%d",&a,&b);
add(a,b);
}
for(i=1;i<=n;i++)
if(visit1[i]==0) dfs1(i);
for(i=Tcnt-1;i>=0;i--)
{
if(visit2[T[i]]==0)
{
min=0xfffffff;
dfs2(T[i]);
v1[Bcnt]=min;
Bcnt++;
}
}
for(i=0;i<Bcnt;i++)
{
in_degree[i]=0;
out_degree[i]=0;
}
for(i=0;i<tol1;i++)
{
x=Belong[edge1[i].from];
y=Belong[edge1[i].to];
if(x!=y)
{
in_degree[y]=1;
out_degree[x]=1;
}
}
sum=0;
count=0;
for(i=0;i<Bcnt;i++)
{
if(in_degree[i]==0) {sum+=v1[i];count++;}
}
printf("%d %d\n",count,sum);
}
return 0;
}
相似回答