#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
//定义结点类型
typedef struct Node
{
ElemType data; //单链表中的数据域
struct Node *next; //单链表的指针域
}LinkNode,*LinkList;
//单链表的初始化
LinkList Init()
{
LinkNode *L;
L = (LinkNode *)malloc(sizeof(LinkNode)); //申请结点空间
if(L == NULL) //判断是否有足够的内存空间
printf("申请内存空间失败\n");
L->next = NULL; //将next设置为NULL,初始长度为0的单链表
}
//尾插法建立单链表
LinkList Create(int n)
{
LinkNode *L;
L = (LinkNode *)malloc(sizeof(LinkNode)); //申请头结点空间
L->next = NULL; //初始化一个空链表
LinkNode *r;
r = L; //r始终指向终端结点,开始时指向头结点
ElemType x; //x为链表数据域中的数据
while(n--)
{
scanf("%d",&x);
LinkNode *p;
p = (LinkNode *)malloc(sizeof(LinkNode)); //申请新的结点
p->data = x; //结点数据域赋值
r->next = p; //将结点插入到表头L-->|1|-->|2|-->NULL
r = p;
}
r->next = NULL;
return L;
}
//判断链表是否为空链表
int isEmpty(LinkList L)
{
return (L->next==NULL);
}
//单链表的插入,在链表的第i个位置插入x的元素
LinkList Insert(LinkList L,int m,ElemType x)
{
LinkNode *pre; //pre为前驱结点
pre = L;
int i = 0;
for(i = 1; i < m; i++)
pre = pre->next; //查找第m个位置的前驱结点
LinkNode *p; //插入的结点为p
p = (LinkNode *)malloc(sizeof(LinkNode));
p->data = x;
p->next = pre->next;
pre->next = p;
return L;
}
//单链表的删除,在链表中删除值为x的元素
LinkList Deletenum(LinkList L,ElemType x)
{
LinkNode *p,*pre; //pre为前驱结点,p为查找的结点。
p = L->next;
pre = L;
while(p->data != x) //查找值为x的元素
{
pre = p;
p = p->next;
}
pre->next = p->next; //删除操作,将其前驱next指向其后继。
free(p);
return L;
}
//单链表的删除,在链表中删除位置为n的元素
LinkList Delete(LinkList L,int n)
{
LinkNode *p,*pre;
p = L->next;
pre = L;
int i;
for(i = 1;i < n;i++)
{
pre = p;
p = p->next;
}
pre->next = p->next;
free(p);
return L;
}
//两个有序单链表的合并
LinkList Merge(LinkList head1,LinkList head2)
{
LinkNode *pa,*pb;
LinkList head3;
pa = head1->next;
pb = head2->next;
head3 = head1;
head3->next=NULL;
LinkList r=head3;
while(pa!=NULL&&pb!=NULL)
{
if(pa->data<=pb->data)
{
r->next=pa;
r=pa;
pa=pa->next;
}
else
{
r->next=pb;
r=pb;
pb=pb->next;
}
}
if(pa)
r->next=pa;
else
r->next=pb;
free(head2);
return head3;
}
//单链表的倒置
void Inverse(LinkList head)
{
LinkNode *p = head->next;
LinkNode *tmp = NULL;
head->next = NULL;
while (p != NULL)
{
tmp = p->next;
p->next = head->next;
head->next = p;
p = tmp;
}
}
//判断是否存在值为n的元素
int Exist(LinkList head,ElemType n)
{
LinkNode *p=head->next;
while(p!=NULL)
{
if(p->data==n)
{
return 1;
}
p=p->next;
}
return 0;
}
//输出链表
void Print(LinkList head)
{
LinkNode *p = head->next;
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
//获得位置为n处的元素
ElemType Take(LinkList head,int n)
{
int i;
LinkNode *p=head->next;
for(i=1;i<n;i++)
{
p=p->next;
}
return p->data;
}
//获得值为x的元素的位置
int Find(LinkList L,int x)
{
LinkNode *p = L->next;
int i = 1;
while(p != NULL)
{
if(p->data == x)
return i;
i++;
p = p->next;
}
return -1;
}
int main()
{
LinkList list,list1;
int n;
scanf("%d",&n);
printf("请输入单链表的数据:");
list = Create(n);
list1 = Create(n+2);
list = Merge(list,list1);
Print(list);
int i;
ElemType x;
printf("请输入插入数据的位置:");
scanf("%d",&i);
printf("请输入插入数据的值:");
scanf("%d",&x);
Insert(list,i,x);
Print(list);
printf("\n");
printf("请输入要删除的元素的值:");
scanf("%d",&x);
Deletenum(list,x);
Print(list);
int m;
printf("请输入要删除的元素的位置:");
scanf("%d",&m);
Delete(list,m);
Print(list);
Inverse(list);
Print(list);
ElemType p;
p = Take(list,1);
int l,q,d;
l=Exist(list,10);
q=Find(list,10);
d=isEmpty(list);
printf("%d %d %d %d",p,l,q,d);
return 0;
}
之前写的单链表好奇怪啊……重新改了一下,功能应该比较全了,看起来也整齐一些了~