//L为头结点的单链表
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
typedef int elemType;//元素类型
//定义结点
typedef struct _LNode
{
elemType data;
struct _LNode *Next;
}LNode;
//尾插建立链表
void CreatList2(LNode *L,elemType e)
{
LNode *s=(LNode*)malloc(sizeof(LNode));
s->data=e;
s->Next=NULL;
LNode *p=L;
while(p->Next!=NULL)
{
p=p->Next;
}
p->Next=s;
}
//遍历单链表
void TraverseList(LNode *L)
{
LNode *p;
p=L->Next;
//printf("线性表La=");
while(p)
{
printf("%d ",p->data);
p=p->Next;
}
printf("\n");
}
//在第pos个位置前插入元素e
int ListInsert(LNode *L,int pos,elemType e)
{
LNode *p;
LNode *s=(LNode *)malloc(sizeof(LNode));
int j=0;
p=L;
//printf("在第%d个位置前插入元素%d\n",pos,e);
while(p&&j<pos-1)
{
p=p->Next;
++j;
}
if(!p||j>pos-1) return ERROR;
s->data=e;
s->Next=p->Next;
p->Next=s;
return OK;
}
//删除第pos个位置上的元素,并返回其值
int ListDelete(LNode *L,int pos)
{
LNode *p=L;
LNode *q;
int j=0;
while(p->Next&&j<pos-1)
{
p=p->Next;
++j;
}
if(j>pos-1||!p->Next)
return ERROR;
q=p->Next;
p->Next=q->Next;
//printf("删除的元素是:%d\n",q->data);
free(q);
return OK;
}
//查找函数
int ListSearch(LNode *L,elemType e)
{
LNode *p=L->Next;
int cursor=1;
while(p->Next!=NULL)
{
if(p->data==e)
{
printf("找到,%d在第%d个位置\n",e,cursor);
return cursor;
}
p=p->Next;cursor++;
}//while
printf("没找到\n");
}
//逆置单向链表
LNode *ListInverse(LNode *L)
{
if(L==NULL)
return NULL;
if(L->Next==NULL) return L;
LNode *pre=L->Next;
LNode *cur=pre->Next;
LNode *next=cur->Next;
pre->Next=NULL;
cur->Next=pre;
pre=cur;
cur=next;
while(cur!=NULL)
{
next=cur->Next;
cur->Next=pre;
pre=cur;
cur=next;
}
L->Next=pre;
return L;
}
//单链表合并
LNode *MergeList(LNode *La,LNode *Lb,LNode *Lc)
{
LNode *pa=La->Next;LNode *pb=Lb->Next;LNode *pc;
Lc=pc=La;
while(pa&&pb)
{
if(pa->data<=pb->data)
{
//printf("wrong1\n");
pc->Next=pa;pc=pa;pa=pa->Next;
}
else
{
//printf("wrong2\n");
pc->Next=pb;pc=pb;pb=pb->Next;
}
}//while
pc->Next=pa?pa:pb;
//printf("wrong3\n");
free(Lb);
return La;
}
int main()
{
LNode *list1=(LNode*)malloc(sizeof(LNode));
list1->Next=NULL;
int nums;elemType x;
scanf("%d",&nums);
int i;
for(i=0;i<nums;i++)
{
scanf("%d",&x);
CreatList2(list1,x);
}
printf("创建好的线性表La=");
TraverseList(list1);
int pos;
scanf("%d%d",&x,&pos);
ListInsert(list1,pos,x);
printf("插入一个元素后的线性表La=");
TraverseList(list1);
scanf("%d",&pos);
ListDelete(list1,pos);
printf("删除一个元素后的线性表La=");
TraverseList(list1);
scanf("%d",&x);
ListSearch(list1,x);
list1=ListInverse(list1);
printf("逆置后的线性表La=");
TraverseList(list1);
LNode *list2=(LNode*)malloc(sizeof(LNode));
list2->Next=NULL;
scanf("%d",&nums);
for(i=0;i<nums;i++)
{
scanf("%d",&x);
CreatList2(list2,x);
}
// printf("线性表Lb=");
// TraverseList(list2);
LNode *list3;
MergeList(list1,list2,list3);
printf("合并La和Lb后的线性表=");
TraverseList(list1);
return 0;
}
数据结构的C实现_单向链表
最新推荐文章于 2024-03-22 20:20:53 发布