实验三 线性表的链式存储
掌握线性表的链式存储结构的定义及C语言实现
掌握单链表中的各种基本操作(单链表的建立、合并、删除等)
实验内容:
1、 单链表的建立及输出(插入)
参考代码:
/*保存在头文件Linklist.h*/
#include <stdio.h>
#include<malloc.h>
#define NULL 0
typedef int Elemtype;
typedef struct Lnode{
Elemtype data;
struct Lnode *next;
}Lnode,*Linklist;
//使用尾插法创建单链表
void creatlist_L(Linklist L,int n)
{
int i;
Linklist p,q;
q=L;
for(i=1;i<=n;i++)
{
p=(Linklist)malloc(sizeof(Lnode));
printf("输入线性表的第%d个元素:",i);
scanf("%d",&p->data);
p->next=q->next;
q->next=p;
q=q->next;
}
}
//使用头插法创建单链表
void creatlist_L(Linklist L,int n)
{
int i;
Linklist p,q;
q=L;
for(i=1;i<=n;i++)
{
p=(Linklist)malloc(sizeof(Lnode));
printf("输入线性表的第%d个元素:",i);
scanf("%d",&p->data);
p->next=L->next;
L->next=p;
}
}
void traverlist_L(Linklist head)
{
Linklist p;
printf("以head 为头指针的单链表中的元素为:");
p=head->next;
while(p!=NULL)
{
printf("%5d ",p->data);
p=p->next;
}
printf("\n");
}
#include<stdio.h>
#include”Linklist.h”
void main()
{
#include<stdio.h>
#include"Linklist.h"
void main()
{
Linklist head;
int n;
printf("********建立一个单链表中的操作******\n");
printf("输入要建立链表的长度:");
scanf("%d",&n);
head=(Linklist)malloc(sizeof(Lnode));
head->next=NULL;
creatlist_H(head,n);
printf("\n********输出单链表中 元素*****\n");
traverlist_L(head);
Getelem(head);
Listdelete(head);
traverlist_L(head);
}}
2、 单链表的查找
创建一个单链表,编写单链表的查找函数,实现单链表的查找。
void Getelem(Linklist L)
{
void Getelem(Linklist L)
{
Linklist p;
Elemtype e;
int j;
int i;
p = L->next;
j=1;
printf("输入要查找的元素位置:\n");
scanf("%d",&i);
while(p&&j<i)
{
p=p->next;
++j;
}
if(!p||j>i)
printf("查找错误");
e=p->data;
printf("%5d ",e);
printf("\n");
}
}
3、 单链表的删除
创建一个单链表,编写函数实现单链表的删除操作。
void Listdelete(Linklist &L)
{
Linklist p,q;
int i,j;
j=0;
printf("输入要删除的元素位置:\n");
scanf("%d",&i);
p = L;
while ((p->next) && (j<i-1))
{
p=p->next;
++j;
}
if(!(p->next) || (j>i-1))
{
printf("删除位置非法\n");
}
q=p->next;
p->next=q->next;
free(q);
}
4、 有序单链表的合并
建立两个带头结点的有序单链表La,Lb(单调递增),利用La,Lb的结点空间,将La和Lb合并成一个按元素值递增的有序单链表Lc。
参考代码:
#include <Linklist.h>
void mergelist_L(Linklist La,Linklist Lb,Linklist Lc)
{
Linklist pa,pb,pc;
pa=La->next;
pb=Lb->next;
Lc = La;
pc=Lc;
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,Lb,Lc;
int n1,n2;
La=(Linklist)malloc(sizeof(Lnode));
La->next=NULL;
printf("******两个单链表的合并操作******\n");
printf("\n请输入要建立的链表La的长度:");
scanf("%d",&n1);
creatlist_L(La,n1);
printf("\n******输出链表La中元素******\n");
traverlist_L(La);
Lb=(Linklist)malloc(sizeof(Lnode));
Lb->next=NULL;
printf("******两个单链表的合并操作******\n");
printf("\n请输入要建立的链表Lb的长度:");
scanf("%d",&n2);
creatlist_L(Lb,n2);
printf("\n******输出链表Lb中元素******\n");
traverlist_L(Lb);
printf("\n******下面执行合并操作******\n");
Lc=La;
mergelist_L(La,Lb,Lc);
printf("\n******输出由链表La和Lb归并所得新的链表Lc中的元素******\n");
traverlist_L(Lc);
}