今天开启数据结构学习的第一章节。
说到数据结构,必须要提的便是结构体了,结构体构建了高级数据结构的框架,在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 #include2 #include <string.h> 3 4 struct Books 5 { 6 char title[50]; 7 char author[50]; 8 char subject[100]; 9 int book_id; 10 }; 11 12 /* 函数声明 */ 13 void printBook( struct Books *book ); 14 int main( ) 15 { 16 struct Books Book1; /* 声明 Book1,类型为 Books */ 17 struct Books Book2; /* 声明 Book2,类型为 Books */ 18 19 /* Book1 详述 */ 20 strcpy( Book1.title, "C Programming"); 21 strcpy( Book1.author, "Nuha Ali"); 22 strcpy( Book1.subject, "C Programming Tutorial"); 23 Book1.book_id = 6495407; 24 25 /* Book2 详述 */ 26 strcpy( Book2.title, "Telecom Billing"); 27 strcpy( Book2.author, "Zara Ali"); 28 strcpy( Book2.subject, "Telecom Billing Tutorial"); 29 Book2.book_id = 6495700; 30 31 /* 通过传 Book1 的地址来输出 Book1 信息 */ 32 printBook( &Book1 ); 33 34 /* 通过传 Book2 的地址来输出 Book2 信息 */ 35 printBook( &Book2 ); 36 37 return 0; 38 } 39 void printBook( struct Books *book ) 40 { 41 printf( "Book title : %s\n", book->title); 42 printf( "Book author : %s\n", book->author); 43 printf( "Book subject : %s\n", book->subject); 44 printf( "Book book_id : %d\n", book->book_id); 45 }
5.位域(由于不常用,就不写了)
经过结构体知识的梳理,下面开始研究栈。
栈(堆栈),百度词条里面的解释是:限定仅在表尾进行插入和删除操作的线性表(是n个具有相同特性的数据元素的有限序列,元素具有一对一关系)。
为了更好的学习,我把堆栈有关的代码全部贴出来:
1 typedef int ElemType;//自定义类型 2 3 typedef struct 4 { 5 ElemType Element[MaxSize]; 6 int Top; 7 } SeqStack; 8 9 void Init_SeqStack(SeqStack* S_pointer)//创建空栈 10 { 11 S_pointer->Top = -1; 12 } 13 14 15 bool Full_SeqStack(SeqStack* S_pointer)//判断栈满 16 { 17 if (S_pointer->Top ==MaxSize -1) return true; 18 else return false; 19 } 20 21 bool Empty_SeqStack(SeqStack* S_pointer)//判断栈空 22 { 23 if (S_pointer->Top == -1) return true; 24 else return false; 25 } 26 27 bool Push_SeqStack(SeqStack* S_pointer, ElemType x)//进栈 28 { 29 if (Full_SeqStack(S_pointer) == true) 30 return Overflow; 31 else 32 { 33 S_pointer->Top++; 34 S_pointer->Element[S_pointer->Top] = x; 35 return OK; 36 } 37 } 38 39 void SetNull_SeqStack(SeqStack* S_pointer)//清空栈 40 { 41 S_pointer->Top = -1; 42 } 43 44 bool Pop_SeqStack(SeqStack* S_pointer, ElemType* x_pointer)//出栈 45 { 46 if (Empty_SeqStack(S_pointer) == true) 47 return Underflow; 48 else 49 { 50 *x_pointer = S_pointer->Element[S_pointer->Top]; 51 52 S_pointer->Top--; 53 return OK; 54 } 55 }
附上一道经典例题:十进制转换八进制。
1 void conversion(int Num) 2 { 3 int temp; 4 SeqStack ListStack;//定义一个顺序栈 5 Init_SeqStack(&ListStack);//创建空栈 6 while (Num) {//Num不为0时 7 Push_SeqStack(&ListStack, Num % 8);//压入Num%8 8 Num = Num / 8;//Num取整 9 } 10 while (Empty_SeqStack(&ListStack) == false)//栈不为空时 11 { 12 Pop_SeqStack(&ListStack, &temp);//退栈 13 printf("%d", temp);//显示栈顶元素 14 } 15 SetNull_SeqStack(&ListStack);//清空栈 16 17 } 18 19 int main() 20 { 21 int Num; 22 printf_s("Please input a number:\n"); 23 scanf_s("%d", &Num); 24 conversion(Num); 25 return 0; 26 }
这题本身还有更简单的解法,为了学习栈,我大材小用了。
1 //解法2: 2 #include3 #define MaxSize 1001 4 int main() 5 { 6 int Numb, temp,count=0,i = 0;; 7 scanf_s("%d", &Numb); 8 int Num[MaxSize]; 9 while (Numb) { temp = Numb % 8; Num[i] = temp; i++; Numb = Numb / 8; count++; } 10 for (int j = count-1; j >= 0; j--) 11 printf_s("%d", Num[j]); 12 printf_s("\n"); 13 return 0; 14 }
以上,便是今天我学习的内容了。