带表头结点的单向链表

表头结点:

1、分配空间但不赋值,表头结点的作用(本身不带数据,仅标志表头,从第二个结点开始操作)


2、首先创建结点,然后新结点指针域指向NULL;(*head = NULL);


程序代码:


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


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


struct node *next;
};


typedef struct node Node;
typedef struct node * Link;


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


if(*new_node == NULL)
{
printf("malloc is error!\n");
exit(-1);
}
}
void creat_link(Link *head)
{
creat_new_node(head);
(*head)->next = NULL;
}


void insert_node_head(Link head,Link new_node)
{
new_node->next = head->next;
head->next = new_node;
}


void insert_node_tail(Link head,Link new_node)
{
Link p = head;


     while(p->next != NULL)
{
p = p->next;
}


p->next = new_node;
new_node->next = NULL;
}


void display_link(Link head)
{
    Link p = head->next;


if(head->next == NULL)
{
printf("the list is empty\n");
}
    else
{
    while(p != NULL)
    {
            printf("%d  %s\n",p->num,p->name);
      printf("\n");


    p = p->next;
    }
}
}


void free_link(Link head)
{
Link p = head->next;


while(p != NULL)
{
head->next = p->next;
free(p);
p = head->next;
}


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


int len(Link head)
{
int n = 0; 
Link p = head->next;


while(p != NULL)
{
        n++;
p = p->next;
}
return n;
}


Link search(Link head,int m)
{
    Link p = head->next;
if(head->next == NULL)
{
printf("这是一个空链表!\n");
return;
    }
while(p != NULL && (p->num) != m)
{
p = p->next;
}


return p;
}


void delete(Link head,int n)
{
Link p;
Link q;


if(head->next == NULL)
{
printf("the list is empty!\n");
}
else
{
p = head;
q = p;
    while(p != NULL && (p->num) != n)
    {
    q = p;
    p = p->next;
    }
if(p == NULL)
{
printf("没有这个数!\n");
}
else
{
q->next = (p->next);
free(p);
        display_link(head);
}      
}
}


void insert(Link head,int loc)
{
Link q = head;
Link p = head;
Link new_node = NULL;


    creat_new_node(&new_node);


if(head->next == NULL)
{
printf("这是一个空链表!\n");
}
else
{
while(p != NULL && (p->num) != loc)
{
q = p;
p = p->next;
}


if(p == NULL)
{
printf("没有这个学号!\n");
return;
}
else
{
           q->next = new_node;
  new_node->next = p;
}


}
printf("enter the number:");
scanf("%d",&(new_node->num));
printf("enter the name:");
scanf("%s",new_node->name);
printf("插入后的结果是:\n");
display_link(head);


}




void reverse(Link head)
{
Link p = head->next;
    Link p1;
Link p2;
Link p3;


if(head->next == NULL)
{
printf("链表是空的\n");
}
else
{
p1 = head->next;
if(p1->next == NULL)
      {
    printf("链表只有一个节点\n");
      }
    else
    {
        p2 = p1->next;
        p3 = p2->next;
    p2->next = p1;


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


}
}


}


void insert_sort(Link head,Link new_node)
{
Link p;
Link q;


    if(head->next == NULL)
{
if((new_node->num) > (head->num))
{
            insert_node_tail(head,new_node);
}
else
{
            insert_node_head(head,new_node);
}
}
else
{
p = head->next;
q = p;
while(p!= NULL && p->num < (new_node->num))
{
q = p;
p = p->next;
}
if(p == head->next)
{
            insert_node_head(head,new_node);
}
else
{
            new_node->next = p;
   q->next = new_node;
}
}


}


int main()
{
int i,t,m,n,d,loc;
Link head = NULL;
Link f = NULL;


creat_link(&head);


Link new_node = NULL;


printf("你想输入几个姓名:");
scanf("%d",&t);
printf("输入学号和姓名:\n");


for(i = 0;i < t;i++)
{
        creat_new_node(&new_node);


scanf("%d%s",&(new_node->num),new_node->name);


//     insert_node_head(head,new_node);
// insert_node_tail(head,new_node);

    insert_sort(head,new_node);
}


display_link(head);
printf("由小到大排序输出:\n");


display_link(head);


printf("链表长度为 : %d\n",len(head));
printf("输入你想查询的学号:\n");
scanf("%d",&m);
printf("\n");


    f = search(head,m);
if(f != NULL)
{
printf("查询结果是:\n");
   printf("%d  ",f->num);
    printf("%s\n",f->name);
}
    else
{
printf("没有这个数!\n");
}


printf("输入你想删除的那个数:\n");
scanf("%d",&n);
    delete(head,n);


printf("输入你想插入的位置上的那个数 :\n");
scanf("%d",&loc);


insert(head,loc);


printf("插入后的结果是\n");
display_link(head);




printf("倒序输出是:\n");
reverse(head);


display_link(head);


free_link(head);


    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值