#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ok 1
#define no 0
struct node{
int num;
char name[];
char sex;
struct node *next;
};
typedef struct node Node;
typedef Node * Link;
int create_link(Link *head)
{
*head = (Link)malloc(sizeof(Node));
if(*head == NULL)
{
printf("malloc head fail\n");
return no;
}
else
{
(*head)->next = NULL;
return ok;
}
}
int create_node(Link *new_node)
{
*new_node = (Link)malloc(sizeof(Node));
if(*new_node == NULL)
{
printf("malloc node fail\n");
return no;
}
else
{
return ok;
}
}
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 insert_node_head(Link head,Link new_node)
{
new_node->next = head->next;
head->next = new_node;
}
void insert_node_sort(Link head,Link new_node)
{
Link p = NULL;
Link q = NULL;
q = p = head->next;
while(p!=NULL && p->num<new_node->num)
{
q=p;
p=p->next;
}
if(p==head->next)
{
new_node->next=head->next;
head->next=new_node;
}
else{
new_node->next=p;
q->next=new_node;
}
}
Link *serach_node(Link head,int num)
{
Link p=head->next;
while(p!=NULL && p->num != num)
{
p=p->next;
}
if(p==NULL)
{
return NULL;
}
else
{
return &p;
}
}
void insert_node_mid_pri(Link head,Link new_node,int loc)
{
Link p=head->next;
Link q=head->next;
while(p!=NULL && p->num!=loc)
{
q=p;
p=p->next;
}
if(p==head->next)
{
new_node->next=p;
head->next=new_node;
}
else
{
new_node->next=p;
q->next=new_node;
}
}
void insert_node_mid_next(Link head,Link new_node,int loc)
{
Link p=head->next;
while(p->next!=NULL && p->num != loc)
{
p=p->next;
}
new_node->next=p->next;
p->next=new_node;
}
void delete_node(Link head,int num)
{
Link p=head->next;
Link q=head->next;
while(p!=NULL &&p->num!=num)
{
q=p;
p=p->next;
}
if(p==NULL)
{
printf("no this node!\n");
return;
}
else
{
q->next=p->next;
free(p);
}
}
void reverse_link(Link head)
{
Link p1=NULL;
Link p2=NULL;
Link p3=NULL;
if(head==NULL)
{
printf("no this link\n");
return;
}
p1=head->next;
if(p1->next==NULL)
{
return;
}
p2=p1->next;
p3=p2->next;
while(p3!=NULL)
{
p2->next=p1;
p1=p2;
p2=p3;
p3=p3->next;
}
p2->next=p1;
head->next->next=NULL;
head->next=p2;
}
void print_link(Link head)
{
Link p=head;
if(head == NULL)
{
printf("no this link\n");
return;
}
else if(head->next == NULL)
{
printf("the link is empty\n");
return;
}
else
{
printf("the link is:\n");
p = p->next;
while(p!=NULL)
{
printf("%d\n",p->num);
p = p->next;
}
}
}
void clean_link(Link head)
{
Link p = head->next;
while(p!=NULL)
{
head->next=p->next;
free(p);
p=head->next;
}
head->next=NULL;
printf("the link is clean!\n");
}
void release_link(Link *head)
{
clean_link(*head);
free(*head);
*head=NULL;
printf("the link free success\n");
}
int length_link(Link head)
{
Link p = head;
int count=0;
if(head == NULL)
{
printf("no this link");
return count=0;
}
else if(head->next == NULL)
{
return count=0;
}
else
{
p = p->next;
while(p != NULL)
{
p = p->next;
count++;
}
return count;
}
}
int main()
{
Link head = NULL;
Link new_node = NULL;
int i,num,loc;
srand((unsigned)time(NULL));
if(ok == create_link(&head))
{
printf("create link success!\n");
}
printf("\n");
printf("随机生成值进行排序插入:\n");
for(i=0;i<10;i++)
{
if(ok == create_node(&new_node))
{
new_node->num = rand()%100;
insert_node_sort(head,new_node);
}
}
print_link(head);
printf("随机生成一个值进行头插法:\n");
if(ok == create_node(&new_node))
{
new_node->num = rand()%100;
insert_node_head(head,new_node);
}
print_link(head);
printf("随机生成一个值进行尾插法:\n");
if(ok == create_node(&new_node))
{
new_node->num = rand()%100;
insert_node_tail(head,new_node);
}
print_link(head);
int length=length_link(head);
printf("链表长度:%d\n",length);
printf("请输入需要查找的数:");
scanf("%d",&num);
Link *res=serach_node(head,num);
if(res==NULL)
{
printf("无此结点\n");
}else
{
printf("res->num=%d\n",(*res)->num);
}
printf("请输入插入的位置:\n");
scanf("%d",&loc);
printf("请输入在位置前插入的值:\n");
scanf("%d",&num);
if(ok == create_node(&new_node))
{
new_node->num = num;
insert_node_mid_pri(head,new_node,loc);
}
print_link(head);
printf("请输入插入的位置:\n");
scanf("%d",&loc);
printf("请输入在位置后面插入的值:\n");
scanf("%d",&num);
if(ok == create_node(&new_node))
{
new_node->num = num;
insert_node_mid_next(head,new_node,loc);
}
print_link(head);
printf("请输入需要删除的值:\n");
scanf("%d",&num);
delete_node(head,num);
print_link(head);
reverse_link(head);
printf("the reverse link:\n");
print_link(head);
release_link(&head);
print_link(head);
return 0;
}
2022/2/17
最新推荐文章于 2023-04-18 19:05:14 发布