构建链表

链表

 

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;
}

 

posted @ 2024-03-17 21:49  该说不唠  阅读(20)  评论(0)    收藏  举报