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

来源:互联网 发布:java调用kettle 编辑:程序博客网 时间:2024/06/05 05:03

程序:

#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 is_malloc_ok(Link new_node)                        //判断给new_node分配空间是否成功;
{
if(new_node == NULL)
{
        printf("malloc error !\n");
exit(-1);
}
}

void creat_node(Link *new_node)
{
*new_node = (Link)malloc(sizeof (Node));
is_malloc_ok(*new_node);
}

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

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

void insert_new_node_tail(Link head,Link new_node)                  //尾插;
{
Link p;
p = head;
if(head ->next == NULL)
{
        head->next = 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->next;
if(head->next == 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->next != NULL)
    {
p = head->next;
head->next = p->next;
free(p);
}
}

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

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

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

void nixu(Link head)                                      //将链表逆序;
{

Link p1;
Link p2;
Link p3;
    Link p;
p = head->next;
p1 = head->next;

if(p1 == NULL || p1->next == NULL)
{
return;
}
else 
{
p2 = p1 ->next;
p3 = p2->next;

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

void input(Link *new_node)                               //输入,给节点中的变量赋值;
{
    creat_node(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->next;
        q = head->next;
if(p == NULL)
{
head->next = new_node;
new_node->next = NULL;
}
else
{
if((new_node->num) <= (p->num))
{
new_node->next = p;
head->next = new_node;
}
else
{
if(p->next == NULL)
{
p->next = new_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;

int i;
int len;
int n;

Link new_node = NULL;

creat_link(&head);

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

0 0
原创粉丝点击