#include<stdio.h>
#include<stdlib.h>
typedef int datatype;
typedef struct link_node
{
datatype info;
struct link_node *next;//指向下一个数据结点的指针
}node;
node *init()/*建立一个空的单链表*/
{
return NULL;
}
void display(node *head)/*输出单链表各个节点的值*/
{
node *p=head;/*node *p;p=head;*/
if(!p) //p==NULL
printf("单链表是空的!");
else
{
printf("\n单链表各个结点的值为:\n");
while(p)
{
printf("%5d",p->info);
p=p->next;
}
}
}
node *find(node *head,int i)/*在单链表中查找第i个结点*/
{
node *p=head;
int j=1;
if(i<1)
return NULL;
while(p&&i!=j)
{
p=p->next;
j++;
}
return p;
}
int find2(node *head,int x)/*查找值为x的结点*/
{
node *p=head;
int i=1;
while(p)
{
if(p->info==x)
{
return i;
break;
}
else if(p->info==NULL)
{
return 0;
break;
}
else
{
p=p->next;
i++;
}
}
}
node *insert(node *head,datatype x,int i)/*在单链表中第i个位置插入一个值为x的新结点*/
{
node *q,*p;
q=find(head,i);
if(!q&&i!=0)
printf("\n找不到第%d个结点,不能插入!\n",i);
else
{
p=(node*)malloc(sizeof(node));/*分配空间*/
p->info=x; /*设置新结点*/
if(i==0) /*插入的结点作为单链表的第一个结点*/
{
p->next=q;
head=p;
}
else
{
p->next=q->next;
q->next=p;/*在第i个位置后插入x*/
}
}
return head;
}
node *dele(node *head,datatype x)/*在单链表中删除一个值为x的结点*/
{
node *p,*pre=NULL;
if(!head)
{
printf("\n单链表是空的,无法删除!\n");
return head;
}
p=head;
while(p&&p->info!=x)//没有找到并且没有找完
{
pre=p;
p=p->next;
}
if(p)
{
if(!pre)//删除第一个结点
{
head=head->next;
free(p);
}
else
{
pre->next=p->next;
free(p);
}
}
return head;
}
node *creat()/*给单链表赋值,以‘0’结束*/
{
int n=0;
node *p,*q,*head;
p=q=(node*)malloc(sizeof(node));
head=NULL; //分配头指针为空
scanf("%d",&p->info);
while(p->info!=0)
{
++n;
if(n==1)
head=p;
else
q->next=p;
q=p;
p=(node*)malloc(sizeof(node));
scanf("%d",&p->info);
}
q->next=NULL;
return head;
}
node *first(node *head,datatype x)/*在单链表最前面插入x*/
{
node *p;
p=(node*)malloc(sizeof(node));//malloc分布动态内存
p->info=x;
p->next=head;
head=p;
return head;
}
node *reverse(node *head)
{
}
int main()
{
node *head;
int a,i;
datatype x;
while(1)
{
printf("/***********************************************************/\n");
printf("/* 1.建立一个空的单链表 2.给单链表输入数据 */\n");
printf("/* 3.输出单链表各节点的值 4.在单链表中查找第i个结点 */\n");
printf("/* 5.值为x的结点位置 6.在第i个节点位置插入x */\n");
printf("/* 7.删除一个值为x的结点 8.在第一个结点前插入x */\n");
printf("/* 9.退出 */\n");
printf("/***********************************************************/\n");
scanf("%d",&a);
switch(a)
{
case 1:
{
head=init();
printf("\n操作完成!请继续。\n");
break;
}
case 2:
{
head=creat();
printf("\n操作完成!请继续。\n");
break;
}
case 3:
{
display(head);
printf("\n操作完成!请继续。\n");
break;
}
case 4:
{
printf("请输入你需要查找的结点:");
scanf("%d",&i);
printf("第i个结点为:%d",find(head,i)->info);
printf("\n操作完成!请继续。\n");
break;
}
case 5:
{
printf("请输入你需要查找的值:");
scanf("%d",&x);
printf("查找的数的结点数为:%d",find2(head,x));
printf("\n操作完成!请继续。\n");
break;
}
case 6:
{
printf("请输入第i个位子:");
scanf("%d",&i);
printf("请输入你需要插入的数x:");
scanf("%d",&x);
head=insert(head,x,i);
printf("\n操作完成!请继续。\n");
break;
}
case 7:
{
printf("请输入你需要删除的数:");
scanf("%d",&x);
head=dele(head,x);
printf("\n操作完成!请继续。\n");
break;
}
case 8:
{
printf("请输入你需要插入的数 x:");
scanf("%d",&x);
head=first(head,x);
printf("\n操作完成!请继续\n");
break;
}
case 9:
{
printf("程序结束!\n");
return 0;
}
}
return 0;
}