#include <stdio.h> #include <stdlib.h> typedef struct PStudent { int sid; char name[100]; char sex; }*Student,STU;//Student===> struct PStudent* STU等价于struct PStudent void main() { STU s1; Student ps = &s1; ps->sid = 82; s1.sid = 34; printf("ps->sid:%d", ps->sid); system("pause"); }
链表的插入操作:
//LinkList.h #ifndef _LINKLIST_H_ #define _LINKLIST_H_ //单链表的存储结构 //结点中包含后继结点地址的指针域组成-可以理解为指向下一个结构体(结点) //(这里不包含数据域,是实现了 链表的api(链表的算法) 和 具体的数据分离) typedef struct _tag_LinkListNode { struct _tag_LinkListNode *next; }LinkListNode; //为void 再重新多取一个名字,LinkList等价于void //typedef + 已有的数据类型+新的数据类型(自己取的新名字) typedef void LinkList; //创建并且返回一个空的链式的线性表 LinkList* LinkList_Create(); //销毁一个链式的线性表list void LinkList_Destroy(LinkList* list); //将一个链式线性表list中的所有元素清空, 链式线性表回到创建时的初始状态 void LinkList_Clear(LinkList* list); //返回一个链式线性表list中的所有元素个数 int LinkList_Length(LinkList* list); //向一个链式线性表list的pos位置处插入新元素node int LinkList_Insert(LinkList* list, LinkListNode* node, int pos); //获取一个链式线性表list的pos位置处的元素 LinkListNode* LinkList_Get(LinkList* list, int pos); //删除一个链式线性表list的pos位置处的元素 返回值为被删除的元素,NULL表示删除失败 LinkListNode* LinkList_Delete(LinkList* list, int pos); #endif
//LinkList.c #include <stdlib.h> #include <string.h> #include <stdio.h> #include "linklist.h" //定义头结点 链式存储头结点:表示链表中第一个节点,包含指向第一个数据元素的指针以及链表自身的一些信息 //这样能把所有结点串起来 typedef struct _tag_LinkList { LinkListNode header;//要有个头指针---指向头结点的指针 int length;//底层库中加了多少个结点 }TLinkList; //创建并且返回一个空的链式的线性表 LinkList* LinkList_Create() { //1 申请动态内存空间 TLinkList *tmp = NULL; tmp = (TLinkList *)malloc(sizeof(TLinkList)); if (NULL == tmp) { printf("func err malloc\n"); return NULL; } //2 让开辟的内存 完成链式线性表初始化 memset(tmp,0,sizeof(TLinkList)); //3 链表的初始化 tmp->header.next = NULL; tmp->length = 0; return tmp; } //销毁一个链式的线性表list //链表节点的生命周期由调用者负责,也就是main()函数负责,链表的销毁只需释放头结点空间 void LinkList_Destroy(LinkList* list) { //1 缓存下来 进行操作 TLinkList *tmp = NULL; tmp = (TLinkList *)list; if (NULL == list) { printf("func err LinkList_Destroy\n"); } //2 释放头结点空间 if (tmp!=NULL) { free(tmp); } } //将一个链式线性表list中的所有元素清空, 链式线性表回到创建时的初始状态 //链表的清空只是将头结点的指针域指向NULL,以及链表的长度length赋值为0 void LinkList_Clear(LinkList* list) { //1 缓存下来 进行操作 TLinkList *tmp = NULL; tmp = (TLinkList *)list; if (NULL == list) { printf("func err LinkList_Clear\n"); } //2 清空链表 tmp->header.next = NULL; tmp->length = 0; } //返回一个链式线性表list中的所有元素个数 int LinkList_Length(LinkList* list) { int ret = 0; //1 缓存下来 进行操作 TLinkList *tmp = NULL; tmp = (TLinkList *)list; if (NULL == list) { ret = -1; printf("func err LinkList_Length:%d\n",ret); return ret; } ret = tmp->length; return ret; } //向一个链式线性表list的pos位置处插入新元素node int LinkList_Insert(LinkList* list, LinkListNode* node, int pos) { int ret = 0; //1 缓存下来 进行操作 TLinkList *tmp = NULL; tmp = (TLinkList *)list; //辅助指针 用来遍历当前指针位置 LinkListNode *pCur = NULL; if (NULL == list || NULL == node || pos < 0) { ret = -1; printf("func err (NULL == list || NULL == node || pos < 0):%d\n", ret); return ret; } //1 当前指针 初始化 指向 头结点 pCur = &(tmp->header); //2 进行遍历 找到插入位置 for (int i = 0; i < pos; i++) { pCur = pCur->next; } //3 进行插入操作 node->next = pCur->next;//1 pCur->next = node; //4 链表长度++ tmp->length++; return ret; } //获取一个链式线性表list的pos位置处的元素 LinkListNode* LinkList_Get(LinkList* list, int pos) { int ret = 0; //1 缓存下来 进行操作 TLinkList *tmp = NULL; tmp = (TLinkList *)list; //辅助指针 用来遍历当前指针位置 LinkListNode *pCur = NULL; if (NULL == list || pos < 0) { ret = -1; printf("func err (NULL == list|| pos < 0):%d\n", ret); return NULL; } //1 当前指针 初始化 指向 头结点 pCur = &(tmp->header); //2 进行遍历 找到pos位置 for (int i = 0; i < pos; i++) { pCur = pCur->next; } return pCur->next; } //删除一个链式线性表list的pos位置处的元素 返回值为被删除的元素,NULL表示删除失败 LinkListNode* LinkList_Delete(LinkList* list, int pos) { int ret = 0; //1 缓存下来 进行操作 TLinkList *tmp = NULL; tmp = (TLinkList *)list; //辅助指针 用来缓存要删除的结点 LinkListNode *Deletemp = NULL; //辅助指针 用来遍历当前指针位置 LinkListNode *pCur = NULL; if (NULL == list || pos < 0) { ret = -1; printf("func err (NULL == list|| pos < 0):%d\n", ret); return NULL; } //1 当前指针 初始化 指向 头结点 pCur = &(tmp->header); //2 进行遍历 找到要删除的pos位置 for (int i = 0; i < pos; i++) { pCur = pCur->next; } //3 缓存要删除的元素 Deletemp = pCur->next; //4 进行删除操作 pCur->next = Deletemp->next; //5 链表长度-- tmp->length--; return Deletemp; }
//text.c //线性表的链式存储设计与实现 #include <stdlib.h> #include <string.h> #include <stdio.h> #include "LinkList.h" //业务结点 typedef struct Teacher { LinkListNode node; //包含指针域节点 //下面是业务域 int age; char name[64]; }Teacher; int main() { int len = 0, ret = 0, i = 0; LinkList* list = NULL; Teacher t1, t2, t3, t4, t5; t1.age = 31; t2.age = 32; t3.age = 33; t4.age = 34; t5.age = 35; list = LinkList_Create(); if (NULL == list) { ret = -1; printf("func err LinkList_Create():%d\n", ret); return ret; } len = LinkList_Length(list); if (len < 0) { ret = -2; printf("func err LinkList_Length():%d\n", ret); return ret; } //链表的算法和具体业务节点的分离 头插法 ret = LinkList_Insert(list, (LinkListNode*)(&t1), 0); if (ret != 0) { ret = -3; printf("func err LinkList_Insert():%d\n", ret); return ret; } ret = LinkList_Insert(list, (LinkListNode*)(&t2), 0); ret = LinkList_Insert(list, (LinkListNode*)(&t3), 0); ret = LinkList_Insert(list, (LinkListNode*)(&t4), 0); ret = LinkList_Insert(list, (LinkListNode*)(&t5), 0); //ret = LinkList_Clear(list); //if (ret != 0) //{ // ret = -6; // printf("func err LinkList_Insert():%d\n", ret); // return ret; //} //遍历 for (i = 0; i< LinkList_Length(list); i++) { Teacher *tmp = (Teacher *)LinkList_Get(list, i); if (NULL == tmp) { ret = -4; printf("func err LinkList_Get():%d\n", ret); return ret; } printf("tmp->age:%d\n", tmp->age); } printf("================================我是分界线===============================\n"); //删除链表 while (LinkList_Length(list) > 0) { Teacher *tmp = (Teacher *)LinkList_Delete(list, 0); if (NULL == tmp) { ret = -5; printf("func err LinkList_Delete():%d\n", ret); return ret; } printf("tmp->age:%d\n", tmp->age); } LinkList_Destroy(list); system("pause"); return ret; }