单链表的线性操作--简单

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

//定义单链表的结构
typedef struct node
{
int data;
struct node *next;
}linklist;

//建立单链表
linklist *creatlist()
{
linklist *head,*p,*q;
head=(linklist *)malloc(sizeof(linklist));
head->next=NULL; //至此,建立一个首结点,首结点不存储数据

p=q=(linklist *)malloc(sizeof(linklist));

head->next=p; //head结点的指针指向p结点
p->next=NULL;

scanf("%d",&(p->data)); //为p,也是q结点输入一个整数

while(p->data!=-1)
{
q->next=p;
q=p;
p=(linklist *)malloc(sizeof(linklist));
scanf("%d",&p->data);
}
q->next=NULL;

return head;
}

//统计相同数值的个数
int count(linklist *head,int num)
{
linklist *p;
int n=0;
p=head;
while(p!=NULL)
{
if(p->data==num)
n++;
p=p->next;
}
return n;
}

//定位单链表中某个值的位置
int locatelinklist(linklist *head,int x)
{
linklist *p;
int loc=0;
p=head;
while(p!=NULL && p->data!=x)
{
loc++;
p=p->next;
}
if(p!=NULL)
return loc;
else
return 0;
}

//删除单链表中的一个结点
void deletelinklist(linklist *head,int i)
{
linklist *p,*q;
q=head;
if(i==1)
q=head;
else
{
q=q->next;
int c=1;
while(c<i-1 && q!=NULL)
{
q=q->next;
c++;
} //找到要删除的结点
}
if(q!=NULL && q->next!=NULL)
{
p=q->next;
q->next=p->next;
free(p);
}
else
printf(" 没有要删除的结点! ");
}

//单链表中向第i个位置插入一个新结点
void insertlinklist(linklist *head,int x,int i)
{
linklist *p,*q=head;
if(i==1)
q=head;
else
{
q=q->next;
int c=1;
while(c<i-1 && q!=NULL)
{
q=q->next;
c++;
}
}
if(q!=NULL && q->next!=NULL)
{
p=(linklist *)malloc(sizeof(linklist)); //(1)
p->data=x; //(2)
p->next=q->next; //(3)
q->next=p; //(4)
} //(3)(4)是插入结点的语句
else
printf(" 找不到要插入结点的位置! ");
}

//单链表中结点排序
linklist *bubblesort(linklist *head)
{
linklist *p,*tail,*ne;
int temp;
if(head->next==NULL)
return head;
for(p=head->next;p->next!=NULL;p=p->next)
;
tail=p->next; //确定尾结点的位置
while(tail!=head->next->next)
{
for(p=head->next;p->next!=tail;p=p->next)
{
ne=p->next;
if(p->data>ne->data)
{
temp=p->data;
p->data=ne->data;
ne->data=temp;
}
}
tail=p;
}
return head;
}

//删除重复结点
void purgelist(linklist *head)
{
linklist *p,*q,*r;
q=head->next;
while(q!=NULL)
{
p=q;
while(p->next!=NULL)
{
if(p->next->data==q->data)
{
r=p->next; //指针r指向要删除的结点
p->next=r->next;
free(r);
}
else
p=p->next;
}
q=q->next;
}
}

//显示单链表
void print(linklist *head)
{
linklist *p;
p=head->next;
if(p==NULL)
{
printf("空链表");
}
else
{
do
{
printf("%4d",p->data);
p=p->next;
}while(p!=NULL);
printf(" ");
}
}

//主菜单
void menu()
{
printf(" *********************************** ");
printf(" 1. 创建单链表(首先执行该项) ");
printf(" 2. 单链表中插入一个结点 ");
printf(" 3. 单链表中删除指定位置上结点 ");
printf(" 4. 单链表中定位某个结点的位置 ");
printf(" 5. 单链表中查找重复值 ");
printf(" 6. 单链表结点排序 ");
printf(" 7. 单链表删除重复值结点 ");
printf(" 0. 退出 ");
printf(" *********************************** ");
}

menu_bye()
{
printf(" *********************************** ");
printf(" 欢迎再次使用 ");
printf(" ");
printf(" 再见! ");
printf(" *********************************** ");
}

//主函数
void main()
{
menu(); //程序首先执行菜单
int n;
linklist *h;
while(1)
{
printf("请输入(1-7):");
scanf("%d",&n);
if(n<0 || n>7)
printf("没有此值,请重输入! ");

switch(n)
{
case 0:
system("cls");
menu_bye();
exit(0);
case 1:
printf("请输入一串整数,以空格分隔,以“-1”结束 ");
h=creatlist();
print(h);
break;
case 2:
int number,pos;
printf(" 输入要插入结点的值和位置: ");
scanf("%d%d",&number,&pos);
insertlinklist(h,number,pos);
print(h);
break;
case 3:
int num;
printf(" 输入要删除的结点序号: ");
scanf("%d",&num);
deletelinklist(h,num);
print(h);
break;
case 4:
int data,position;
scanf("%d",&data);
position=locatelinklist(h,data);
printf("位置是:%d",position);
break;
case 5:
int x,cnt;
printf("请输入要查找的值:");
scanf("%d",&x);
cnt=count(h,x);
printf("成绩为%d的学生人数是:%d",x,cnt);
break;
case 6:
linklist *head;
printf("排序结果如下: ");
head=bubblesort(h);
print(head);
break;
case 7:
printf("删除重复结点,输入y或Y执行删除 ");
int j;
getchar();
j=getchar();
if(j=='y' || j=='Y')
{
purgelist(h);
print(h);
}
else
printf("没有重复结点! ");
break;
default:
break;
}
}
}

运行结果:

 

原文地址:https://www.cnblogs.com/duanqibo/p/11589049.html