[关闭]
@chawuciren 2018-10-12T13:36:38.000000Z 字数 2782 阅读 480


链表结构体

未分类

  1. #include<stdio.h>
  2. /* 结构体第一种定义 */
  3. struct Student1{
  4. int id;
  5. int score;
  6. };
  7. /* 结构体第二种定义 */
  8. typedef struct asdasd{
  9. int id;
  10. int score;
  11. } Student2;
  12. int main(void){
  13. /* 注意两种声明的区别 */
  14. struct Student1 s1;
  15. Student2 s2;
  16. s1.id = 2018022628;
  17. s1.score = 100;
  18. s2.id = 2018022629;
  19. s2.score = 59;
  20. printf("ID:%d, Score:%d\n", s1.id, s1.score);
  21. printf("ID:%d, Score:%d\n", s2.id, s2.score);
  22. /* 结构体的地址 */
  23. printf("%p\n", &s1);
  24. printf("%p\n", &(s1.id));
  25. printf("%p\n", &s2);
  26. printf("\n\n");
  27. /* 结构体指针 */
  28. struct Student1* ss1 = &s1;
  29. Student2* ss2 = &s2;;
  30. /* ss2 = &s1; 报错!虽然Student1和Student2的内部定义是一样的,但它们仍然是不同的结构 */
  31. printf("%p\n", ss1);
  32. printf("%p\n", ss2);
  33. /* 用指针的方式访问结构体的内容 */
  34. printf("ID:%d, Score:%d\n", ss1->id, ss1->score);
  35. printf("ID:%d, Score:%d\n", ss2->id, ss2->score);
  36. /* 用指针解引用的方式访问结构体的内容 */
  37. printf("ID:%d, Score:%d\n", (*ss1).id, (*ss1).score);
  38. printf("ID:%d, Score:%d\n", (*ss2).id, (*ss2).score);
  39. return 1;
  40. }
  1. #include<stdio.h>
  2. typedef struct _node{
  3. int data;
  4. struct _node* nextnode; /* 觉得奇怪?先记着*/
  5. /* Wrong! node* nextnode2; */
  6. } node;
  7. int main(void){
  8. node n1;
  9. node n2;
  10. n1.data = 123123;
  11. n1.nextnode = NULL;
  12. n2.data = 456456;
  13. n2.nextnode = NULL;
  14. printf("%d\n", n1.data);
  15. printf("%d\n", n2.data);
  16. printf("\n");
  17. /* n1中的nextnode指针指向n2, n2中的nextnode指向n1 */
  18. n1.nextnode = &n2;
  19. n2.nextnode = &n1;
  20. printf("%d\n", (n1.nextnode)->data);
  21. printf("%d\n", (n2.nextnode)->data);
  22. return 0;
  23. }
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. typedef struct {
  5. int data1;
  6. int data2;
  7. } Node;
  8. int main(void){
  9. /* 分配结构体动态数组 */
  10. int len = 10;
  11. Node* arrayOfNode = (Node*)malloc( sizeof(Node) * len);
  12. for(int i = 0; i < len; i++){
  13. arrayOfNode[i].data1 = i;
  14. (arrayOfNode+i)->data2 = 2*i;
  15. }
  16. for(int i = 0; i < len; i++){
  17. printf("%d\n", (arrayOfNode+i)->data1);
  18. printf("%d\n\n", arrayOfNode[i].data2);
  19. }
  20. /* 动态数组需要释放内存 */
  21. free(arrayOfNode);
  22. return 1;
  23. }
  1. /**************
  2. 链表定义示例
  3. 链表遍历
  4. *************/
  5. #include<stdio.h>
  6. #include<stdlib.h>
  7. typedef struct _LinkedList{
  8. int data;
  9. struct _LinkedList* nextnode;
  10. } LinkedList;
  11. int main(void){
  12. int len = 10;
  13. LinkedList* head = NULL; /* 注意该定义与LinkedList head的区别! */
  14. /* printf("%d\n",head->data); */
  15. LinkedList* temp = NULL;
  16. LinkedList* newNode = NULL;
  17. /* head = (LinkedList*)malloc( sizeof(LinkedList) ); 分配一个结点的空间,然后让head指向它 */
  18. /* temp = head; 此时temp 和 head 指向同一个地方!*/
  19. /* 建立一个有10个结点的链表 */
  20. for(int i = 0; i < 10; i++){ /* 已经分配了一个head结点,接下来只需要分配10个结点即可 */
  21. newNode = (LinkedList*)malloc( sizeof(LinkedList) ); /* 分配一个结点的空间,然后让newNode指向它 */
  22. newNode->data = i;
  23. newNode->nextnode = NULL;
  24. if( i == 0 ){
  25. /* 保存好头结点 */
  26. head = newNode;
  27. temp = head;
  28. }
  29. temp->nextnode = newNode; /* 使temp的下一个结点为newNode,即往链表尾部插入一个结点 */
  30. temp = newNode; /* temp始终指向链表尾端的结点 */
  31. }
  32. /* 此时构造了一个有10个结点的链表!该链表的头结点由head指向 */
  33. /* 遍历链表内容 */
  34. temp = head;
  35. for(int i = 0; i < 10; i++){ /*10个结点*/
  36. printf("%d->",temp->data);
  37. temp = temp->nextnode; //往后移
  38. }
  39. printf("\n\n");
  40. /* 另外一种遍历方法!建议以后链表就这样遍历 */
  41. temp = head;
  42. while( temp != NULL ){
  43. printf("%d->", temp->data);
  44. temp = temp->nextnode;
  45. }
  46. printf("\n\n");
  47. /* 链表结点在内存中的位置不是连续的! */
  48. temp = head;
  49. while( temp != NULL ){
  50. printf("%p->", temp);
  51. temp = temp->nextnode;
  52. }
  53. /* 释放链表所占用内存 */
  54. LinkedList* temp2;
  55. temp = head;
  56. while( temp != NULL ){
  57. temp2 = temp->nextnode;
  58. free(temp);
  59. temp = temp2;
  60. }
  61. return 0;
  62. }

在此输入正文

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注