#include<stdio.h> //若用printf,scanf,getchar,putchar,gets,puts函数需包含该头文件
#include<malloc.h> //用malloc,free,realloc函数需包含该头文件
#include<conio.h>//若用getch()使得屏幕暂停,需包含该头文件
#define MAX 1000
#define OK 0
typedef int ElemType; //先设定数据元素的类型为整型
//定义类型
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
//求表长
int ListLength(LinkList L)
{
int len=0;
LNode *p=L;
while(p->next!=NULL)
{
p=p->next;
len++;
}
return len;
}
//查找元素,获取表中第i个元素的值
int GetElem(LinkList L,int i,ElemType &e)
{
LNode *p=L->next;
int j=1; //p指向第一个结点,j为计数器
while (p && j<i) //顺指针向后查找,直到p指向第i个元素或p为空
{
p = p->next;
++j;
}
if ( !p || j>i )
return 0; //第i个元素不存在
e = p->data; //取得第i个元素
return 1;
}
//判断元素e是否在该链表中
int LocateElem(LinkList &L,ElemType e)
{
LNode *temp=L;
int i=1;
int p=0;
while(temp->next)
{
temp=temp->next;
if(e==temp->data)
{
p=i;
printf("找到了与%d相等元素位置为%d\n",e,p);
return 1;
}
i++;
}
printf("表中没有所查找的元素");
return -1;
}
//打印表中元素值
void PrintList(LinkList L)
{
LNode *temp=L;
int count=0;
while(temp->next)
{
temp=temp->next;
printf("%d\t",temp->data);
count++;
if(count%5==0)
{
printf("\n");
}
}
printf("\n");
}
//插入操作
int ListInsert(LinkList &L,int p,int e)
{
LNode *war=L;
int i=0;
while(i<p-1)
{
war=war->next;
++i;
}
LNode *s=(LNode*)malloc(sizeof(LNode));
s->data=e;
s->next=war->next;
war->next=s;
return OK;
}
//删除操作
int ListDelete(LinkList &L,int i,int e)
{
LNode *temp=L;
int p=0;
while(p<i-1)//找到删除结点的上一个结点
{
temp=temp->next;
++p;
}
LNode *q=temp->next;//定义一个q指向被删除的结点
e=q->data;//保存删除的节点的数据域
temp->next = q->next;
free(q);
return OK;
}
//头插法建表
LinkList CreateList(LinkList L,int n)
{
LNode *s;
int i;
L = (LNode*)malloc(sizeof(LNode));
L ->next = NULL;
//scanf("%d",&i);
for(int a=1;a<=n;++a)
//for(i=0;i<n;++i)
{
scanf("%d",&i);
s = (LNode*)malloc(sizeof(LNode));
s ->data = i;
s ->next = L ->next;
L ->next = s;
}
return L;
// int n,i;
// struct LNode *head,*p,*q;
// printf("请输入要插入元素的个数:\n");
// while(scanf("%d",&n)!=-1)
// {
// head=(struct LNode *)(malloc(sizeof(struct LNode)));
// head->next=NULL;
// printf("请输入要插入的元素:\n");
// for(i=0;i<n;i++)
// {
// p=(struct LNode *)(malloc(sizeof(struct LNode)));
// scanf("%d",&p->data);
// p->next=head->next;
// head->next=p;
// }
// p=head->next;
// while(p!=NULL)
// {
// if(i==n-1) printf("%d\n",p->data);
// else printf("%d",p->data);
// p=p->next;
// q=p;
// return q;
// }
// }
}
//遍历链表
//合并两个有序表
void MergeList(LinkList La,LinkList Lb,LinkList &Lc)
{
LinkList pa=La->next;
LinkList pb=Lb->next;
LinkList pc;
Lc=pc=La;
while(pa&&pb)
{
if(pa->data<=pb->data)
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
else
{
pc->next=pb;
pc=pb;
pb=pb->next;
}
}
pc->next=pa?pa:pb;
free(Lb);
}
//主函数
void main()
{
LinkList La;
ElemType e;
int i,n;
//int a[MAX];
//创建第一个表
printf("1.建第一个表 \n");
printf("请输入要插入的元素个数:\n");
scanf("%d",&n);
printf("请输入%d个元素:\n",n);
//for(int j=0;j<n;++j)
//{
// scanf("%d",&a[j]);
//}
La=CreateList(La,n);
printf("表中元素为:\n");
PrintList(La);
//取值
printf("\n2.查找第i位元素的值\n请输入位序:");
scanf("%d",&n);
GetElem(La,n,e);
printf("第%d位元素的值为:%d\n",n,e);
//定位
printf("\n3.定位操作\n请输入要查找的元素:");
scanf("%d",&e);
i=LocateElem(La,e);
if(i)
printf("\n");
else
printf("表中无该元素\n");
//插入
int p;
printf("\n4.插入操作\n输入要插入元素的位序:");
scanf("%d",&i);
printf("输入要插入的元素值:");
scanf("%d",&p);
ListInsert(La,i,p);
printf("插入后表中元素为:\n");
PrintList(La);
//删除
printf("\n5.删除操作\n输入要删除元素的位序:");
scanf("%d",&n);
ListDelete(La,n,e);
printf("要删除的元素值为:%d\n",e);
printf("删除后表中元素为:\n");
PrintList(La);
//建立第二个表
LinkList Lb,Lc;
int r;
printf("n6.建立第二个表\n");
printf("请输入要插入的元素个数:\n");
scanf("%d",&r);
//int b[MAX];
printf("请输入%d个元素:\n",r);
//for(int f=0;f<r;++f)
//{
//scanf("%d",&b[f]);
//}
Lb=CreateList(Lb,r);
printf("表中元素为:\n");
PrintList(Lb);
//合并
printf("\n7.合并两个有序表:\n");
MergeList(La,Lb,Lc);
printf("合并后Lc表中元素为:\n");
PrintList(Lc);
printf("");
getch();
}
自己想存下来 里面很多东西没有删除 可能有些许错误 如有发现还请不吝指出