【一文搞清楚指针结构体还有单链表】

可直接使用 测试,开车稳稳的
数据结构基础 指针 结构体 链表


//结构体与指针-油门踩到底,一口气讲他个水落石出

#include 
#include 
#include 

struct {
    char name[50];
    int age;

}boy,girl;


struct Person {
    char name[50];
    int age;
    float height;
};

typedef struct Student {
    char name[50];
    int age;
    float height;
}Stu,*p_stu;


/
typedef struct LNode {
  int data;
  struct LNode * next;
} LNode, *LinkList;


// 初始化链表
bool List_Init (LinkList &pHead) {
  pHead = (LNode *) malloc(sizeof(LNode)); // 为头结点分配内存并将地址存储在pHead中。
  if (pHead == NULL) return false; // 检查内存分配是否成功(pHead不为NULL)。
  pHead->next = NULL; // 初始化头结点的'next'指针为NULL,因为它是链表中唯一的节点。
  return true;
}
// 创建链表,头插法结果为倒叙
LinkList List_Create(LinkList &pHead) {
  LNode *pTemp; int x; // 临时节点指针
  scanf("%d", &x);
  while (x != 999) {
    pTemp = (LNode *)malloc(sizeof(LNode)); // 分配内存并创建新节点
    pTemp->data = x;
    pTemp->next = pHead->next; // 新节点的指针指向当前头节点的下一个节点
    pHead->next = pTemp; // 头指针指向新节点,使其成为新的头节点
    scanf("%d", &x);
  }
  return pHead; // 返回带头结点的链表头指针
}
// 遍历链表
void printList(struct LNode *head) {
    struct LNode *current =head->next;
    while (current != NULL) {
        printf("%d ", current->data);  // 访问当前节点的数据
        current = current->next;       // 移动到下一个节点
    }
}

void testLNode(){
	LinkList alist;
	List_Init(alist);
	List_Create(alist);
	
	printList(alist);
	
	
	
}
///
int main(){
	testLNode();
	return 0;
	//
	//boy={"tony",21};
	//这种初始化方式只能在定义结构体变量的时候使用,
	//     要是变量已经定义好了,就不能用大括号进行整体赋值了。
	//struct boy={"tony",21};
	boy.age=19;
	//boy.name="Lixuan";
	strcpy(boy.name,"Lihua");
	printf("%s   : age= %d",boy.name,boy.age);
	
	printf("\n输入girl name age   \n");
	// note name传递的是 地址 他就是数组首地址  但age 不是 要 & 来取出地址
	scanf("%s %d",girl.name,&girl.age);
	printf("%s   : age= %d",girl.name,girl.age);
	
	//但是这只能有俩,太不方便了,要是可以新定义原先类型的就好了
	//   so
	struct Person stu_1 = {"lluu",20,167.56};
	struct Person stu_2;
	stu_2.age=23;
	strcpy(stu_2.name,"Tiny");
	printf("new friend :%s  age = %d\n",stu_1.name,stu_1.age);
	
	//非常好 现在就像数组一样 可以添加新的同类很方便了,老是写sruct 麻烦
	
	Stu friend_3 = {"XueBa",21,169.98};
	
	printf("haha,new friend :%s  age = %d\n",friend_3.name,friend_3.age);
	//虽然写Stu 方便了不少, 如果同学觉得不够高级,还想以后可以动态调节开销,怎么搞呢
	// 怎么像修改年龄一样方便呢
	// 那就定义一个这样的指针呗
	
	Stu *temp;
	temp=&friend_3;
	(*temp).age=22;
	printf("change!  new friend :%s  age = %d\n",friend_3.name,friend_3.age);
	//  其实还可以  用 ->
	//其实 scanf他就是用指针实现的 strcpy函数  也是
	scanf("%s",temp->name);// == scanf("%s",friend_3.name); or  scanf("%s",(*temp).name);
	printf("Name change!  new friend :%s  age = %d\n",friend_3.name,friend_3.age);
	
/**  
	//3
	Stu students[3];

	Stu *p = students;  // 指向数组首元素
	
	for (int i = 0; i < 3; i++) {
	    p->age = 20 + i;  // 等价于 students[i].age
	    scanf("%s %d %f",p->name,&p->age,&p->height);
	    p++;  // 指向下一个元素
	}
	Stu *t = students;  // 指向数组首元素

	while(t<(students+3))
	{
		
		printf("info: %s %d %f cm\n",t->name,t->age,t->height);
		t++;  // 指向下一个元素
	}
	
	
	printf("\nhelllo\n");
	
*/
	return 0;
}


你可能感兴趣的:(数据结构,c++,学习,链表,C)