单链表
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int ElemType;
typedef struct node //定义结点
{
ElemType date;
struct node *next;
}LinkList;
int menu() //菜单
{
int i;
printf("=============单链表==================\n");
printf("========1.头插法建立单链表===========\n");
printf("========2.尾插法建立单链表===========\n");
printf("========3.在链表中进行插入===========\n");
printf("========4.在链表中进行删除===========\n");
printf("========5.计算元素的位序=============\n");
printf("========6.单链表元素的倒置===========\n");
printf("========7.删除重复元素===============\n");
printf("========8.打印单链表的信息===========\n");
printf("please input your action (1--6):\n");
scanf("%d",&i);
return i;
}
LinkList *createList_x(int n) //头插法手动赋值
{
LinkList *head,*p;
int i;
head=(LinkList *)malloc(sizeof(LinkList));
head->next=NULL;
for(i=0;i<n;i++)
{
p=(LinkList *)malloc(sizeof(LinkList));
printf("请输入第%d个结点的值\n",i+1);
scanf("%d",&(p->date));
p->next=head->next;
head->next=p;
}
return head;
}
LinkList *createList_xz(int n) //头插法函数赋值
{
LinkList *head,*p;
int i,magic;
head=(LinkList *)malloc(sizeof(LinkList));
head->next=NULL;
for(i=0;i<n;i++)
{
p=(LinkList *)malloc(sizeof(LinkList));
magic=rand()%100+1;
p->date=magic;
p->next=head->next;
head->next=p;
}
return head;
}
LinkList *createlist(int n) //尾插法
{
int i;
LinkList *r,*head,*p;
head=(LinkList *)malloc(sizeof(LinkList));
r=head;
for(i=0;i<n;i++)
{
p=(LinkList *)malloc(sizeof(LinkList));
printf("请输入第%d个结点的值\n",i+1);
scanf("%d",&(p->date));
r->next=p;
r=p;
}
r->next=NULL;
return head;
}
int printflist(LinkList *head) //打印单链表
{
LinkList *p;
p=head->next;
printf("链表输出结果如下:\n");
while(p!=NULL)
{
printf("%5d",p->date);
p=p->next;
}
printf("\n");
}
int InsertElem(LinkList *head,int i,ElemType e) //插入元素
{
LinkList *p,*s;
int j=1;
p=head->next;
while(p!=NULL&&j<i-1)
{
p=p->next;
j++;
}
s=(LinkList *)malloc(sizeof(LinkList));
s->date=e;
s->next=p->next;
p->next=s;
}
int DeleteElem(LinkList *head,int i) //删除元素
{
LinkList *p,*q;
int j=1;
p=head->next;
while(p!=NULL&&j<i-1)
{
p=p->next;
j++;
}
q=p->next;
p->next=q->next;
free(q);
}
int Location(LinkList *head,int e) //求位序
{
int j=1,cnt=1;
LinkList *p;
p=head->next;
while(p!=NULL&&p->date!=e)
{
cnt++;
p=p->next;
}
return cnt;
}
int coverlist(LinkList *head) //单链表的倒置
{
LinkList *p,*r;
p=head->next;
head->next=NULL;
while(p!=NULL)
{
r=p;
p=p->next;
r->next=head->next;
head->next=r;
}
}
int deleaterepelem(LinkList *head) //删除重复元素
{
LinkList *p,*q,*r;
for(r=head->next;r->next!=NULL;r=r->next)
{
for(p=r,q=p->next;q!=NULL;p=q,q=q->next)
{
if(r->date==q->date&&q->next!=NULL)
{
p->next=q->next;
free(q);
q=p->next;
}
if(r->date==q->date&&q->next==NULL)
{
p->next=NULL;
free(q);
}
}
}
}
int main() //主函数
{
LinkList *head;
int n,a,i,e,t,b;
while(1)
{
b=menu();
switch(b)
{
case 1:system("cls");
printf("请输入要建立的节点数目\n");
scanf("%d",&n);
printf("函数为链表元素赋值扣1,键盘输入扣2\n");
scanf("%d",&a);
if(a==1)
head=createList_xz(n);
if(a==2)
head=createList_x(n);
break;
case 2:system("cls");
printf("请输入要建立的节点数目\n");
scanf("%d",&n);
head=createlist(n);
break;
case 3:system("cls");
printf("输入您要插入值得位置,与插入的值\n");
scanf("%d %d",&i,&e);
InsertElem(head,i,e);
break;
case 4:system("cls");
printf("输入您要删除值的位置\n");
scanf("%d",&t);
DeleteElem(head,t);
break;
case 8:system("cls");
printflist(head);
break;
case 5:system("cls");
printf("请输入您所查的值:\n");
scanf("%d",&e);
a=Location(head,e);
printf("您所查的%d位于单链表的第%d个节点处\n",e,a);
break;
case 6:
system("cls");
coverlist(head);
break;
case 7:system("cls");
deleaterepelem(head);
break;
}
}
}