程序:
#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;
}