链表

来源:互联网 发布:美橙域名 编辑:程序博客网 时间:2024/06/12 01:28

链表(画图写相应的代码)

(初始化、显示、插入(头插、中间插、尾插)、删除、逆序)

定义结点类型、定义头指针、初始化链表、创建链表

1.      不带表头的单链表

//初始化

void init_link(Link*head)

{

    *head = NULL;

}

//显示

void display_link(Linkhead)

{

Link temp = head;

while(temp != NULL)

{

   printf(“%d”, temp->num);

   temp = temp->next;

}

}

//头插

void insert_head_node(Linknewnode, Link *head)

{

newnode->next = *head;

*head = newnode;

}

//中间插

int insert_mid_node(Linknewnode, Link head, int num)

{

if(head == NULL)

{

   return -1;

}

Link temp = head;

while(temp != NULL)

{

   if(temp->num == num)

    {

        newnode->next = temp->next;

        temp->next = newnode;

return0;

}

temp= temp->next;

}

return -1;

}

//尾插

void insert_tail_node(Linknewnode, Link *head)

{

if(*head == NULL)

{

   newnode->next == NULL;

   *head = newnode;

}

Link temp = *head;

while(temp->next != NULL)

{

   temp = temp->next;

}

temp->next = newnode;

newnode->next = NULL;

}

//删除

int delete_node(Link*head, int num)

{

if(*head == NULL)

{

   return -1;

}

Link temp = *head;

if((*head)->num == num)

{

   *head = (*head)->next;

   free(temp);

return0;

}

Link ptr = temp;

temp = temp->next;

while(temp != NULL)

{

   if(temp->num == num)

    {

        ptr->next = temp->next;

        free(temp);

        temp = NULL;

return0;

}

ptr= temp;

temp= temp->next;

}

return -1;

}

//倒序

int reverse_link(Link*head)

{

if(*head == NULL ||(*head)->next == NULL)

{

   return -1;

}

Link str = *head;

Link ptr= str->next;

Link temp = ptr->next;

while(temp != NULL)

{

   ptr->next = str;

   str = ptr;

   ptr = temp;

   temp = temp->next;

}

ptr->next = str;

(*head)->next = NULL;

*head = ptr;

}

2.      带表头的单链表

//初始化

void init_link(Link*head)

{

    *head = (Link)malloc(sizeof(Node));

(*head)->next= NULL;

}

//显示

void display_link(Linkhead)

{

Link temp = head;

while(temp != NULL)

{

   printf(“%d”, temp->num);

   temp = temp->next;

}

}

//头插

void insert_head_node(Linknewnode, Link *head)

{

newnode->next= (*head)->next;

(*head)->next= newnode;

}

//中间插

int insert_mid_node(Linknewnode, Link head, int num)

{

Linktemp = head->next;

while(temp != NULL)

{

   if(temp->num == num)

    {

        newnode->next = temp->next;

        temp->next = newnode;

return0;

}

temp= temp->next;

}

return -1;

}

//尾插

void insert_tail_node(Linknewnode, Link *head)

{

Link temp = *head;

while(temp->next != NULL)

{

   temp = temp->next;

}

temp->next = newnode;

newnode->next = NULL;

}

//删除

int delete_node(Link*head, int num)

{

if((*head)->next== NULL)

{

   return -1;

}

Link temp = *head;

Link ptr = temp;

temp = temp->next;

while(temp != NULL)

{

   if(temp->num == num)

    {

        ptr->next = temp->next;

        free(temp);

        temp = NULL;

return0;

}

ptr= temp;

temp= temp->next;

}

return -1;

}

//倒序

int reverse_link(Link*head)

{

if((*head)->next== NULL || (*head)->next->next == NULL)

{

   return -1;

}

Link str = *head;

Link ptr= str->next;

Link temp = ptr->next;

while(temp != NULL)

{

   ptr->next = str;

   str = ptr;

   ptr = temp;

   temp = temp->next;

}

ptr->next = str;

(*head)->next->next= NULL;

(*head)->next= ptr;

}

3.      单向循环链表

//初始化

void init_link(Link*head)

{

    *head = (Link)malloc(sizeof(Node));

(*head)->next= *head;

}

//显示

void display_link(Linkhead)

{

Link temp = head;

while(temp != head)

{

   printf(“%d”, temp->num);

   temp = temp->next;

}

}

//头插

void insert_head_node(Linknewnode, Link *head)

{

newnode->next= (*head)->next;

(*head)->next= newnode;

}

//中间插

int insert_mid_node(Linknewnode, Link head, int num)

{

Linktemp = head->next;

while(temp != head)

{

   if(temp->num == num)

    {

        newnode->next = temp->next;

        temp->next = newnode;

return0;

}

temp= temp->next;

}

return -1;

}

//尾插

void insert_tail_node(Linknewnode, Link *head)

{

Link temp = *head;

while(temp->next != *head)

{

   temp = temp->next;

}

temp->next = newnode;

newnode->next = *head;

}

//删除

int delete_node(Link*head, int num)

{

if((*head)->next== *head)

{

   return -1;

}

Link temp = *head;

Link ptr = temp;

temp = temp->next;

while(temp != *head)

{

   if(temp->num == num)

    {

        ptr->next = temp->next;

        free(temp);

        temp = NULL;

return0;

}

ptr= temp;

temp= temp->next;

}

return -1;

}

//倒序

int reverse_link(Link*head)

{

if((*head)->next== *head || (*head)->next->next ==*head)

{

   return -1;

}

Link str = *head;

Link ptr= str->next;

Link temp = ptr->next;

while(temp != *head)

{

   ptr->next = str;

   str = ptr;

   ptr = temp;

   temp = temp->next;

}

ptr->next = str;

(*head)->next->next= *head;

(*head)->next= ptr;

}

4.      双向循环链表

(你的next指向我,我的prior指向你)

//初始化

void init_link(Link*head)

{

*head = (Link)malloc(sizeof(Node));

(*head)->prior = *head;

(*head)->next = *head;

}

//显示

void display_link(Linkhead)

{

Link temp = head->next;

while(temp != head)

{

   printf(“%d”, temp->num);

   temp = temp->next;

}

}

//头插

void insert_head_node(Linknewnode, Link head)

{

newnode->next = head->next;

head->next->prior = newnode;

head->next = newnode;

newnode->prior = head;

}

//中间插

int insert_mid_node(Linknewnode, Link head, int num)

{

Link temp = head->next;

while(temp != head)

{

   if(temp->num == num)

    {

        newnode->next = temp->next;

        temp->next->prior = newnode;

        temp->next = newnode;

        newnode->prior = temp;

return0;

}

temp= temp->next;

}

return -1;

}

//尾插

void insert_tail_node(Linknewnode, Link head)

{

head->prior->next = newnode;

newnode->prior =head->prior;

newnode->next = head;

head->prior = newnode;

}

//删除

int delete_node(Link head,int num)

{

Link temp = head->next;

while(temp != head)

{

   if(temp->num == num)

    {

        temp->prior->next =temp->next;

       temp->next->prior =temp->prior;

        free(temp);

        temp = NULL;

        return 0;

}

temp= temp->next;

}

return -1;

}

 

0 0
原创粉丝点击