@chawuciren
2018-10-12 13:36
字数 2782
阅读 547
链表结构体
未分类
#include<stdio.h>
/* 结构体第一种定义 */
struct Student1{
int id;
int score;
};
/* 结构体第二种定义 */
typedef struct asdasd{
int id;
int score;
} Student2;
int main(void){
/* 注意两种声明的区别 */
struct Student1 s1;
Student2 s2;
s1.id = 2018022628;
s1.score = 100;
s2.id = 2018022629;
s2.score = 59;
printf("ID:%d, Score:%d\n", s1.id, s1.score);
printf("ID:%d, Score:%d\n", s2.id, s2.score);
/* 结构体的地址 */
printf("%p\n", &s1);
printf("%p\n", &(s1.id));
printf("%p\n", &s2);
printf("\n\n");
/* 结构体指针 */
struct Student1* ss1 = &s1;
Student2* ss2 = &s2;;
/* ss2 = &s1; 报错!虽然Student1和Student2的内部定义是一样的,但它们仍然是不同的结构 */
printf("%p\n", ss1);
printf("%p\n", ss2);
/* 用指针的方式访问结构体的内容 */
printf("ID:%d, Score:%d\n", ss1->id, ss1->score);
printf("ID:%d, Score:%d\n", ss2->id, ss2->score);
/* 用指针解引用的方式访问结构体的内容 */
printf("ID:%d, Score:%d\n", (*ss1).id, (*ss1).score);
printf("ID:%d, Score:%d\n", (*ss2).id, (*ss2).score);
return 1;
}
#include<stdio.h>
typedef struct _node{
int data;
struct _node* nextnode; /* 觉得奇怪?先记着*/
/* Wrong! node* nextnode2; */
} node;
int main(void){
node n1;
node n2;
n1.data = 123123;
n1.nextnode = NULL;
n2.data = 456456;
n2.nextnode = NULL;
printf("%d\n", n1.data);
printf("%d\n", n2.data);
printf("\n");
/* n1中的nextnode指针指向n2, n2中的nextnode指向n1 */
n1.nextnode = &n2;
n2.nextnode = &n1;
printf("%d\n", (n1.nextnode)->data);
printf("%d\n", (n2.nextnode)->data);
return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct {
int data1;
int data2;
} Node;
int main(void){
/* 分配结构体动态数组 */
int len = 10;
Node* arrayOfNode = (Node*)malloc( sizeof(Node) * len);
for(int i = 0; i < len; i++){
arrayOfNode[i].data1 = i;
(arrayOfNode+i)->data2 = 2*i;
}
for(int i = 0; i < len; i++){
printf("%d\n", (arrayOfNode+i)->data1);
printf("%d\n\n", arrayOfNode[i].data2);
}
/* 动态数组需要释放内存 */
free(arrayOfNode);
return 1;
}
/**************
链表定义示例
链表遍历
*************/
#include<stdio.h>
#include<stdlib.h>
typedef struct _LinkedList{
int data;
struct _LinkedList* nextnode;
} LinkedList;
int main(void){
int len = 10;
LinkedList* head = NULL; /* 注意该定义与LinkedList head的区别! */
/* printf("%d\n",head->data); */
LinkedList* temp = NULL;
LinkedList* newNode = NULL;
/* head = (LinkedList*)malloc( sizeof(LinkedList) ); 分配一个结点的空间,然后让head指向它 */
/* temp = head; 此时temp 和 head 指向同一个地方!*/
/* 建立一个有10个结点的链表 */
for(int i = 0; i < 10; i++){ /* 已经分配了一个head结点,接下来只需要分配10个结点即可 */
newNode = (LinkedList*)malloc( sizeof(LinkedList) ); /* 分配一个结点的空间,然后让newNode指向它 */
newNode->data = i;
newNode->nextnode = NULL;
if( i == 0 ){
/* 保存好头结点 */
head = newNode;
temp = head;
}
temp->nextnode = newNode; /* 使temp的下一个结点为newNode,即往链表尾部插入一个结点 */
temp = newNode; /* temp始终指向链表尾端的结点 */
}
/* 此时构造了一个有10个结点的链表!该链表的头结点由head指向 */
/* 遍历链表内容 */
temp = head;
for(int i = 0; i < 10; i++){ /*10个结点*/
printf("%d->",temp->data);
temp = temp->nextnode; //往后移
}
printf("\n\n");
/* 另外一种遍历方法!建议以后链表就这样遍历 */
temp = head;
while( temp != NULL ){
printf("%d->", temp->data);
temp = temp->nextnode;
}
printf("\n\n");
/* 链表结点在内存中的位置不是连续的! */
temp = head;
while( temp != NULL ){
printf("%p->", temp);
temp = temp->nextnode;
}
/* 释放链表所占用内存 */
LinkedList* temp2;
temp = head;
while( temp != NULL ){
temp2 = temp->nextnode;
free(temp);
temp = temp2;
}
return 0;
}
在此输入正文