waitwolf 2019-10-25
今天开启数据结构学习的第一章节。
说到数据结构,必须要提的便是结构体了,结构体构建了高级数据结构的框架,在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。
关于结构体,分别有如下几个知识点:定义声明结构体,初始化,访问结构体的成员,结构作为函数的参数,指向结构的指针,还有位域(相对不常用)。下面分别对几个知识点进行复习:
1.定义声明结构体。
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
} book;Books为结构体的标签,book为结构变量。
结构体里面,可以包含其他结构体,也可以包含指向自己的结构体。用于构建复杂的数据结构。
2.结构体的初始化。
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
} book = {"C 语言", "RUNOOB", "编程语言", 123456};3.访问成员。
可以用“.”进行访问。如上面book结构体,可以用book.book_id进行访问。
4.结构作为函数参数。
可以把结构作为函数参数,传参方式与其他类型的变量或指针类似。
5.指向结构的指针。
struct Books* S_pointer;
使用指针访问结构体成员:必须用到“->”运算符
//实例: 1 #include <stdio.h>
#include <string.h>
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
};
/* 函数声明 */
void printBook( struct Books *book );
int main( )
{
struct Books Book1; /* 声明 Book1,类型为 Books */
struct Books Book2; /* 声明 Book2,类型为 Books */
/* Book1 详述 */
strcpy( Book1.title, "C Programming");
strcpy( Book1.author, "Nuha Ali");
strcpy( Book1.subject, "C Programming Tutorial");
Book1.book_id = 6495407;
/* Book2 详述 */
strcpy( Book2.title, "Telecom Billing");
strcpy( Book2.author, "Zara Ali");
strcpy( Book2.subject, "Telecom Billing Tutorial");
Book2.book_id = 6495700;
/* 通过传 Book1 的地址来输出 Book1 信息 */
printBook( &Book1 );
/* 通过传 Book2 的地址来输出 Book2 信息 */
printBook( &Book2 );
return 0;
}
void printBook( struct Books *book )
{
printf( "Book title : %s\n", book->title);
printf( "Book author : %s\n", book->author);
printf( "Book subject : %s\n", book->subject);
printf( "Book book_id : %d\n", book->book_id);
}5.位域(由于不常用,就不写了)
经过结构体知识的梳理,下面开始研究栈。
栈(堆栈),百度词条里面的解释是:限定仅在表尾进行插入和删除操作的线性表(是n个具有相同特性的数据元素的有限序列,元素具有一对一关系)。
为了更好的学习,我把堆栈有关的代码全部贴出来:
typedef int ElemType;//自定义类型
typedef struct
{
ElemType Element[MaxSize];
int Top;
} SeqStack;
void Init_SeqStack(SeqStack* S_pointer)//创建空栈
{
S_pointer->Top = -1;
}
bool Full_SeqStack(SeqStack* S_pointer)//判断栈满
{
if (S_pointer->Top ==MaxSize -1) return true;
else return false;
}
bool Empty_SeqStack(SeqStack* S_pointer)//判断栈空
{
if (S_pointer->Top == -1) return true;
else return false;
}
bool Push_SeqStack(SeqStack* S_pointer, ElemType x)//进栈
{
if (Full_SeqStack(S_pointer) == true)
return Overflow;
else
{
S_pointer->Top++;
S_pointer->Element[S_pointer->Top] = x;
return OK;
}
}
void SetNull_SeqStack(SeqStack* S_pointer)//清空栈
{
S_pointer->Top = -1;
}
bool Pop_SeqStack(SeqStack* S_pointer, ElemType* x_pointer)//出栈
{
if (Empty_SeqStack(S_pointer) == true)
return Underflow;
else
{
*x_pointer = S_pointer->Element[S_pointer->Top];
S_pointer->Top--;
return OK;
}
}附上一道经典例题:十进制转换八进制。
void conversion(int Num)
{
int temp;
SeqStack ListStack;//定义一个顺序栈
Init_SeqStack(&ListStack);//创建空栈
while (Num) {//Num不为0时
Push_SeqStack(&ListStack, Num % 8);//压入Num%8
Num = Num / 8;//Num取整
}
while (Empty_SeqStack(&ListStack) == false)//栈不为空时
{
Pop_SeqStack(&ListStack, &temp);//退栈
printf("%d", temp);//显示栈顶元素
}
SetNull_SeqStack(&ListStack);//清空栈
}
int main()
{
int Num;
printf_s("Please input a number:\n");
scanf_s("%d", &Num);
conversion(Num);
return 0;
}这题本身还有更简单的解法,为了学习栈,我大材小用了。
//解法2:
#include<stdio.h>
#define MaxSize 1001
int main()
{
int Numb, temp,count=0,i = 0;;
scanf_s("%d", &Numb);
int Num[MaxSize];
while (Numb) { temp = Numb % 8; Num[i] = temp; i++; Numb = Numb / 8; count++; }
for (int j = count-1; j >= 0; j--)
printf_s("%d", Num[j]);
printf_s("\n");
return 0;
}以上,便是今天我学习的内容了。