数据结构,清华 严蔚敏,例题代码(自己写的,持续更新中)
本帖最后由 慢跑20 于 2014-3-10 21:38 编辑计算机基础课数据结构,清华严蔚敏这本书是公认的一本好书。
刚好这学期我们学习数据结构,想把一些例题的代码写一些、既提高了C语言的水平,又可以加深对数据结构的理解,为以后打下良好的基础。
本层占楼编辑
20页,例2.1 A,B两个集合,合并成C集合。
这个代码是用数组的、算是比较简单的。
#include<stdio.h>
int L_length(char []);
int main(){
void Union(char [],char [],char []);
char a;
char b;
char c;
gets(a);
printf("输入的集合A是\n");
puts(a);
gets(b);
printf("输入的集合B是\n");
puts(b);
Union( a, b, c);
printf("last得到集合C是\n");
puts(c);
return 0;
}
void Union(char a[],char b[],char c[])
{
int flag=1,t=0,i,j,m,n;
m=L_length(b);
n=L_length(a);
for(j=0;j<n;j++)
c=a;
for(i=0;i<m;i++,flag=1) //i为b数组的下标,m为数组个数; j为a数组的下标,n为数组个数;
{for(j=0;j<n;j++)
if(b==a) flag=0;//flag=0,说明有重复的了
if(flag) { c=b;t++ ;}
}
c='\0';
}
int L_length(char a[])
{
int i,t=0;;
for(i=0; a!='\0';i++ )
t++;
return t;
}
本帖最后由 慢跑20 于 2014-3-19 13:53 编辑
li2.1yong用指针:
#include "stdio.h"
#include "string.h"
void Union(char *a,char *b,char *c)
{
char *p=a;
char *q=b;
char *r=c;
while(*p) *r++=*p++;
p=a;
for( ;*q!=0 ; q++,p=a )
{while(*p)
if(*q==*p){q++;p=a;}
else p++;
*r=*q;
r++;
}
*r=0;
}
int main(){
char a;
char b;
char c;
gets(a);
printf("输入的集合A是\n");
puts(a);
gets(b);
printf("输入的集合B是\n");
puts(b);
Union(a,b,c);
printf("last得到集合C是\n");
puts(c);
return 0;
}
第2章最后开始用链表了,由于以前没有接触。这里要重新学习链表:
#include<stdio.h>
struct node
{
int data;
struct node *next;
};
//typedef struct node NODETYPE;
void main()
{
//NODETYPE
node a,b,c,*h,*p;
a.data=10;b.data=20;c.data=30;
h=&a;
a.next=&b;b.next=&c;c.next='\0';
p=h;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
这是一个简单的链表。从这里可以了解规则 此代码为生成一个链表的代码:
#include<stdio.h>
#include<stdlib.h>
struct slist
{
int data;
struct slist *next;
};
typedef struct slist SLIST;
SLIST *creat_slist1()
{
int c;
SLIST *h,*s,*r;
h=(SLIST *)malloc (sizeof(SLIST) ); //生成头结点
r=h;
scanf("%d",&c);
while (c!=-1) //当输入的c为-1时,代表输入结束
{
s=(SLIST *)malloc(sizeof(SLIST) ); //生成一个新结点
s->data=c;
r->next=s;
r=s;
scanf("%d",&c);
}
r->next ='\0';
return h;
}
/*
printf_list(&head)
{ SLIST *h,*s,*r;
int c;
h=(SLIST *)malloc (sizeof(SLIST) );
r=h;
s->data=c;
//scanf("%d",&c);
while (c!=-1)
{
printf("%d",c);
s=(SLIST *)malloc(sizeof(SLIST) );
s->data=c;
r->next=s;
r=s;
}
r->next ='\0';
return h;
}
*/
void main()
{ SLIST *head;
head=creat_slist1(); //调用链表建立函数,得到头结点地址
printf_list(head)
}
2。4节需要用链表计算多项式的加法,因此,熟悉结构体是非常必要的。
#include<stdio.h>
#include<stdlib.h>
struct slist
{
int data;
struct slist *next;
};
typedef struct slist SLIST;
SLIST *creat_slist1()
{
int c;
SLIST *h,*s,*r;
h=(SLIST *)malloc (sizeof(SLIST) ); //生成头结点
r=h;
scanf("%d",&c);
while (c!=-1) //当输入的c为-1时,代表输入结束
{
s=(SLIST *)malloc(sizeof(SLIST) ); //生成一个新结点
s->data=c;
r->next=s;
r=s;
scanf("%d",&c);
}
r->next ='\0';
return h;
}
/**/ //想加入一个函数,在刚才输入链表各个数值之后,再输出这些值。如何写呢?
int printf_list(SLIST *h)
{
//while (!h->next )//教材上经常使用这个语句作为h->next是否为空指针的判断语句,但在VC++里边,这一句与下边一句效果不同,具体原因还不清楚
while (h->next!=0 )
{
printf("%d\n",h->next->data );
h=h->next ;
}
return 1;
}
/**/
void main()
{ SLIST *head;
head=creat_slist1(); //调用链表建立函数,得到头结点地址
printf_list(head);
}
此函数功能为:输入链表中的数,然后依次输出。
页:
[1]