创建不带表头结点的单向链表,并实现各种功能

程序:

#include <stdio.h>
#include <stdlib.h>


struct node
{
int num;
char name[20];


struct node * next;
};
typedef struct node Node;
typedef struct node * Link;                                                                      //重命名;


void creat_link(Link *head)                                                                      //创建一个空链表;
{
    *head = NULL;
}


void is_malloc_ok(Link new_node)                                               //判断给new_node分配空间是否成功;
{
if(new_node == NULL)
{
        printf("malloc error !\n");
exit(-1);
}
}

void insert_new_node_head(Link *head,Link new_node)                                        //头插;
{
    new_node ->next = *head;
*head = new_node;
}       

void insert_new_node_tail(Link *head,Link new_node)                                       //尾插;
{
Link p;
p = *head;
if(*head == NULL)
{
        *head = new_node;
new_node -> next = NULL;
}
else
{
while(p -> next != NULL)
p = p ->next;
p ->next = new_node;
new_node ->next = NULL;
}
}


void display(Link head)                                                                        //链表的输出;
{
Link p;
p = head;
if(head == NULL)
{
printf("link is empty !\n");
}
while(p != NULL)
{
printf("num=%d\n",p ->num);
printf("name=%s\n",p ->name);
p = p->next;
}


}


void release(Link *head)                                                          //释放空间,防止内存的空间的泄露;
{
Link p;
while (*head != NULL)
    {
p = *head;
*head = (*head )->next;
free(p);
}
}


int output_len(Link *head)                                                           //求这个链表的长度;
{
    Link p;
int len = 0;
p = *head;
while(p != NULL)
{
len++;
p = p->next;
    }
return len;
}


Link check(Link *head ,int n)                                                             //查找节点;
{
    Link p;
p = *head;
while(p ->num != n && p != NULL)
{
p = p ->next;
}
return p;
}


void delete(Link *head,int n)                                                         //删除链表中的某个节点;
{
   Link p;
   Link q;
   
   if(*head == NULL)
   {
  printf("链表为空\n");
  return;
   }
   else
   {
  if((*head) ->num == n)
  {
  *head = (*head) ->next;
  free(*head);
  }
  else
  {
  p = *head;
  q = *head;
  while(p != NULL && p ->num != n)
  {
  q = p;
  p = p->next;
  }
  if(p != NULL)
  {
  q ->next = p ->next;
  free(p);
  }
  }




   }




}


void nixu(Link *head)           //将链表逆序;
{
if(*head == NULL || (*head)->next == NULL)
{
return;
}
else 
{
Link p1;
Link p2;
Link p3;


p1 = *head;
p2 = p1 ->next;
p3 = p2->next;


if(p3 == NULL)
{
            p2->next = p1;
*head = p2;
}
else
{
p2->next = p1;
while((p3->next) != NULL)
{
p1 = p2;  
p2 = p3;
p3 = p3->next;
p2->next = p1;


}
p3->next = p2;
(*head)->next = NULL;
*head = p3;
}
}
}


void input(Link *new_node)                                                          //输入,给节点中的变量赋值;
{
*new_node = (Link)malloc(sizeof (Node));
is_malloc_ok(*new_node);
printf("输入num:\n");
    scanf("%d",&(*new_node) -> num);
printf("输入name:\n");
scanf("%s",(*new_node) -> name);
}


void insert_new_node(Link *head,Link new_node)                                        //按顺序插入一个节点;
{
Link p;
Link q;
p = *head;
    q = *head;
if(*head == NULL)
{
*head = new_node;
}
else
{
if((new_node->num) <= (p->num))
{
new_node->next = p;
*head = new_node;
}
else
{
if(p->next == NULL)
{
p->next = n ew_node;
new_node->next = NULL;
}
else
{
while(p !=  NULL && (p->num) < (new_node->num))
{
q = p; 
p = p->next;
}
new_node ->next = p;
q ->next = new_node;


}


}
}
}


int main()
{
Link head = NULL;
Link p;
Link a[10];
int i;
int len;
int n;


creat_link(&head);


Link new_node = NULL;


printf("输入链表节点的个数:\n");
scanf("%d",&n);


for(i = 0;i < n;i++)
{
        input(&new_node);
// insert_new_node_head(&head,new_node);
   insert_new_node_tail(&head,new_node);
}


display(head);


len = output_len(&head);
printf("链表的长度为:%d\n",len);



    printf("请输入要查询的num:\n");
scanf("%d",&n);



    p = check(&head,n);
if(p == NULL)
{
printf("未找到此节点\n");
}
else printf("输出num=%d中name为:\n%s\n",n,p ->name);


delete(&head,n);
printf("删除第%d个节点\n后输出:\n",n);
display(head);



    nixu(&head);
printf("链表逆序后为:\n");
display(head);

    
    printf("从键盘输入一个要插入的节点:\n");
input(&new_node);
insert_new_node(&head,new_node);
display(head);


release(&head);


display(head);



    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值