链表
typedef struct msgdata { char msgtype; char text[27]; }link_data; typedef struct msglist { link_data data; struct msglist * next; }linknode,*linklist;
创建链表思路:
首先创建两个结点,即头结点和尾结点;
然后创建一个函数:在函数内创建一个结点,并分配内存空间;尾结点指向该结点,该结点的next指向空,并返回该结点的指针。返回的结点即为头结点
listhead = creatlist(); linklist listhead,listtail; linklist creatlist(){ linklist h; h=(linklist)(malloc(sizeof(linknode)); listtail =h; h->next=NULL; return h; }
插入结点思路:
创建一个函数,传入参数为结点的数据,在函数内部创建一个结点并分配内存空间,链表的最后一位next指向该结点,更新尾指针,
然后为尾结点赋值,并将尾结点的next指向空。成功返回0,失败返回-1。
int insertlist(link_data x){ linklist h=(linklist)(malloc(sizeof(linknode)); if(h==NULL) { printf("error"); return -1; } listtail->next=h; listtail=h; h->data=x; h->next=NULL; return 0; }
判断结点是否为空的思路:
传入一个结点,如果该节点的next指向为空则链表结束
int emptylist(linklist h){ return h->next==NULL;}
读取并删除一个结点的思路:
该函数的参数为一个头结点,返回值为提取的结点。首先在函数内部判断该链表是否为空,如为空返回NULL;创建一个结点指向头结点的下一个结点,即第一个结点,也就是
我们要提取的结点,保存一下它的地址;然后让头结点指向该结点的下一个结点,然后判断该节点的下一个结点是否为空,如果为空,则提取该结点后,链表为空,要让尾结点
也指向头结点。最后返回提取的结点。
linklist deletelist(linklist h){ if(emptylist(h)){ return NULL; } linklist q; q=h->next; h->next=q->next; if(q->next==NULL) { linktail=h; } return q; }
标签:linklist,结点,return,next,链表,构建,NULL From: https://www.cnblogs.com/gaishuobulao/p/18079264