数据结构实验(一)

 掌握线性表的链式存储结构的定义及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);
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值