链表的操作

来源:互联网 发布:t123ai写软件 编辑:程序博客网 时间:2024/06/06 00:34

  链表有单向链表双向链表,循环链表和不循环,还有带表头和不带表头。链表的操作步骤基本一致

以不带表头的单向不循环链表为例

1.先定义一个结构体,作为链表的节点来使用,例如:

struct node
{
char name[20];
int num;
struct node *next;       //定义一个结构体指针,为了链接节点
};
typedef struct node Node;
typedef struct node * Link;

2.然后创建表头,例如:

void creat_link(Link *head)
{
*head = NULL;
}

3.创建节点

void creat_new_node(Link* new_node)
{
    *new_node = (Link)malloc(sizeof(Node));

if(*new_node == NULL)
{
printf("malloc is error!\n");
exit(-1);
}
}

注:若是带表头的链表,2和3步骤要倒过来

4.插入节点,有头插或者尾插

void insert_node_head(Link *head,Link new_node)   //头插
{
new_node->next = *head;                      //新节点的next指针指向头
*head = new_node;                               //头指针移到新节点
}

void insert_node_tail(Link *head,Link new_node)   //尾插
{
Link p = NULL;
if(*head == NULL)                                //先讨论空链表,即一个节点也没有插入
{
new_node->next = *head;
*head = new_node;
}
else
{
        p = *head;
        while(p->next != NULL)               //链表不为空,移动p指针,找到最后一个节点
    {
    p = p->next;
    }
p->next = new_node;
new_node->next = NULL;
}
}

5.链表输出

void display_link(Link head)
{
    Link p = head;


if(head == NULL)
{
printf("Link is empty!\n");
}


while(p != NULL)
{
        printf("%d  %s\n",p->num,p->name);
printf("\n");


p = p->next;
}
}

6.释放链表

void free_link(Link *head)
{
Link p;


while(*head != NULL)
{
p = *head;                        //释放链表要把头指针往后移动然后释放第一个,最后释放头指针
*head = (*head)->next;
free(p);
}


if(*head == NULL)
{
printf("释放成功!\n");
}
}












0 0
原创粉丝点击