链表2.0
#include<stdio.h>
#include<stdlib.h>
struct node {
// int sign;
int value;
struct node *next;
};
//头插法
struct node *head_add(struct node *p)
{ int n_value;
scanf("%d",&n_value);
struct node *t_node;
t_node=(struct node*)malloc(sizeof(struct node));
if(t_node==NULL)
{
printf("Error\n");
exit(EXIT_FAILURE);
}
t_node->value=n_value;
if(p==NULL) t_node->next=NULL;
else t_node->next=p;
return t_node;
}
//尾插法
struct node *tail_add(struct node *p)
{ int n_value;
scanf("%d",&n_value);
struct node *t_node,*head=NULL;
t_node=(struct node*)malloc(sizeof(struct node));
if(t_node==NULL)
{
printf("Error\n");
exit(EXIT_FAILURE);
}
t_node->value=n_value;
t_node->next=NULL;
if(p!=NULL) p->next=t_node;
return t_node;
}
//定位插入结点
struct node *insert_node(struct node *head)
{ struct node *cur,*prev;
int n;
printf("请输入需要插入结点的位置(即其后一个结点value):");
scanf("%d",&n);
for(prev=NULL,cur=head;
cur->value!=n&&cur!=NULL;
prev=cur,cur=cur->next);
if(cur==NULL)
{
printf("Error:无此节点\n");
return head;
}
else
{ int n_value;
struct node *t_node;
printf("请输入新结点value:");
scanf("%d",&n_value);
t_node=(struct node*)malloc(sizeof(struct node));
if(t_node==NULL)
{
printf("Error\n");
exit(EXIT_FAILURE);
}
t_node->value=n_value;
t_node->next=cur;
if(prev==NULL) head=t_node;
else prev->next=t_node;
return head;
}
}
//结点删除
struct node * delete_node(struct node *head)
{
int n;
printf("请输入需删除结点value;");
scanf("%d",&n);
struct node *cur,*prev;
for(cur=head,prev=NULL;
cur->value!=n&&cur!=NULL;
prev=cur,cur=cur->next);
if(cur==NULL)
{
printf("Error:无此节点\n");
return head;
}
if(prev==NULL) head=cur->next;
else prev->next=cur->next;
free(cur);
return head;
}
//链表打印
void print(struct node *head)
{
for(;head!=NULL;head=head->next)
printf(" %-3d",head->value);
printf("\n");
}
//链表冒泡排序
void bubble_sort(struct node *head,int n)
{
int t,i;
struct node *p;
for(i=1;i<=n;i++)
{
for(p=head;p->next!=NULL;p=p->next)
if(p->value>p->next->value)
{
t=p->value;
p->value=p->next->value;
p->next->value=t;
}
}
}
int main()
{
struct node *p=NULL,*head;
int item,n,i,tuichu,time=1;
printf("请选择头插法或尾插法建表\n"
"************************\n"
"** 1.头插法 **\n"
"** 2.尾插法 **\n"
"************************\n"
"请输入序号:");
scanf("%d",&item);
while(item!=1&&item!=2)
{
printf("Error:非法输入\n"
"请重新输入:");
scanf("%d",&item);
}
printf("请输入结点个数:");
scanf("%d",&n);
printf("请为每个结点赋值(空格隔开):");
switch(item){
case 1: for(i=1;i<=n;i++)
p=head_add(p);
head=p;
break;
case 2: for(i=1;i<=n;i++)
{
p=tail_add(p);
if(i==1) head=p;
}
break;
}
printf("建表完毕.\n");
printf("第%d次打印链表:",time);
print(head);
time++;
while(1)
{
printf("****************************\n"
"** 请选择链表操作 **\n"
"** 1.头插结点 **\n"
"** 2.尾插结点 **\n"
"** 3.定位插入结点 **\n"
"** 4.结点删除 **\n"
"** 5.链表冒泡排序 **\n"
"** 6.退出 **\n"
"****************************\n"
"请输入序号:");
scanf("%d",&item);
while(item!=1&&item!=2&&item!=3&&item!=4&&item!=5&&item!=6)
{
printf("Error:非法输入\n"
"请重新输入:");
scanf("%d",&item);
}
switch (item){
case 1: printf("请输入新结点value:");
head=head_add(head);
n++;
break;
case 2: printf("请输入新结点value:");
for(p=head;p->next!=NULL;p=p->next);
p=tail_add(p);
n++;
break;
case 3: head=insert_node(head);
n++;
break;
case 4: head=delete_node(head);
n--;
break;
case 5: bubble_sort(head,n);
break;
case 6: exit(EXIT_SUCCESS);
}
printf("操作完成\n");
printf("第%d次打印链表:",time);
print(head);
time++;
printf("**********************\n"
"** 请选择: **\n"
"** 1.继续操作 **\n"
"** 2.退出 **\n"
"**********************\n"
"请输入序号:");
scanf("%d",&tuichu);
while(tuichu!=1&&tuichu!=2)
{
printf("Error:非法输入\n"
"请重新输入:");
scanf("%d",&tuichu);
}
if(tuichu==2) break;
}
return 0;
}