链表实现顺序表操作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include
#include
typedef struct LNode
{
int data;
struct LNode *next;
}LNode;
void CreatList_L(LNode *&L, int n)
//建立带头结点的单链线性表L
{
LNode *p1, *p2;
int i;
L = (LNode *)malloc(sizeof(LNode));
L->next = NULL;
p2 = L;
for (i=0; i
p1 = (LNode *)malloc(sizeof(LNode));
printf("第%d个:",i + 1);
scanf("%d",&p1->data);
p1->next = p2->next;
p2->next = p1;
p2 = p1;
}
}//CreatList_L
void PrintList_L(LNode *&L)
//输出链式线性表的值
{
LNode *p = NULL;
p = L->next;
while (p != NULL)
{
printf("%3d",p->data);
p = p->next;
}
printf("\n");
}//PrintList_L
Status GetElem_L(LNode *&L, int i, int &e)
//L为带头结点的单链表
//当第i个元素存在时,将其值赋给e并返回OK,否则返回ERROR
{
LNode *p = NULL;
int j;//用作计数
p = L->next;
j = 1;
while (p && j{
p = p->next;
++j;
}
if (!p || j>i)
{
return ERROR;
}
e = p->data;
return OK;
}//GetElem_L
Status ListInsert_L(LNode *&L, int i, int &e)
//在单链表L中的第i个位置之前插入元素e
{
LNode *p;
LNode *s;//用于建立新加的节点
int j;//用于计数
p = L;
j = 0;
while (p && j
p = p->next;
++j;
}
if (!p || j>i-1)
{
return ERROR;
}
s = (LNode *)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return OK;
}//ListInsert_L
Status DelList_L(LNode *&L, int i, int &e)
//在带头结点的单链表中删除第i个结点,并用e返回其值
{
LNode *p;
LNode *q;
int j;
p = L;
j = 0;
while (p && j
p = p->next;
++j;
}
if (!p || j>i-1)//删除位置不存在
{
return ERROR;
}
q = p->next;
p->next = q->next;
e = q->data;
free(q); //释放删除掉的结点
return OK;
}//DelList_L
void MergList_L(LNode *&La, LNode *&Lb,LNode *&Lc)
{
LNode *pa = NULL;
LNode *pb = NULL;
LNode *p1 = NULL;
LNode *p2 = NULL;
char c = 0;
pa = La->next;
pb = Lb->next;
Lc = (LNode *)malloc(sizeof(LNode));//建立新链表,存储归并后的链表
Lc->next = NULL;
p2 = Lc;
while (pa && pb)
{
if (pa->data >= pb->data)
{
p1 = (LNode *)malloc(sizeof(LNode));
p1->data = pa->data;
p1->next = p2->next;
p2->next = p1;
p2 = p1;
pa = pa->next;
}
else
{
p1 = (LNode *)malloc(sizeof(LNode));
p1->data = pb->data;
p1->next = p2->next;
p2->next = p1;
p2 = p1;
pb = pb->next;
}
}
while (pa)//插入剩余段
{
p1 = (LNode *)malloc(sizeof(LNode));
p1->data = pa->data;
p1->next = p2->next;
p2->next = p1;
p2 = p1;
pa = pa->next;
}
while (pb)//插入剩余短
{
p1 = (LNode *)malloc(sizeof(LNode));
p1->data = pb->data;
p1->next = p2->next;
p2->next = p1;
p2 = p1;
pb = pb->next;
}
}//Merg
List_L
void main(void)
{
LNode *L = NULL;
LNode *La = NULL;
LNode *Lb = NULL;
LNode *Lc = NULL;
int L_length = 0;
int e = 0;//存放第i个元素的值
int insert_value = 0;
int i;//插入/删除元素的位置
printf("输入线性表的长度:");
scanf("%d",&L_length);
/*创建链式线性表*/
CreatList_L(L,L_length);
PrintList_L(L);
/*在表中插入元素*/
printf("\n输入要插入元素的位置:");
scanf("%d",&i);
printf("\n输入要插入元素的值:");
scanf("%d",&insert_value);
ListInsert_L(L,i,insert_value);
PrintList_L(L);
/*删除表中某元素*/
printf("\n输入要删除元素的位置:");
scanf("%d",&i);
DelList_L(L,i,e);
printf("\n删除的元素为:%d\n",e);
PrintList_L(L);
/*建立线性表La,Lb,并将其归并后存入Lc中*/
printf("输入线性表的长度:");
scanf("%d",&L_length);
CreatList_L(La,L_length);
PrintList_L(La);
printf("输入线性表的长度:");
scanf("%d",&L_length);
CreatList_L(Lb,L_length);
PrintList_L(Lb);
MergList_L(La, Lb, Lc);
PrintList_L(Lc);
printf("\n");
}