数据结构实验二 单链表的实现

一、【实验目的】
1、掌握建立单链表的基本方法。

2、掌握单链表的插入、删除算法的思想和实现

二、【实验内容】

仿照教材中的单链表实现例子,自己设计一个有序单链表,单链表中的数据元素为整型并递增有序。有序单链表的定义:

逻辑结构:有序线性表,数据元素递增有序

存储结构:链式

操作集合:初始化、插入、删除、撤销

(1)ListInitiate(L) 初始化线性表,生成一个空表L。

(2)ListInsert(L,x) 在有序表L中插入数据元素x,使得新表仍然有序。

(3)ListDelete(L,x) 删除有序表L中的数据元素x,若删除成功则返回1,不成功则返回0。

(4)Destroy(L) 撤销单链表

要求:

1.有序单链表的操作集合有如下操作:初始化、插入、删除、撤销,使用头文件单链表的代码。

2.编写主函数main()验证所设计的有序单链表是否能正确插入、删除。

提示:

1.插入操作时,从链表的第一个数据元素结点开始,逐个比较每个结点的data域值和x的值,当data小于等于x时,进行下一个结点的比较;否则就找到了插入结点的合适位置,此时申请新结点把x存入,然后把新结点插入;当比较到最后一个结点仍有data小于等于x时,则把新结点插入单链表尾。

2.删除操作时,从链表的第一个数据元素结点开始,逐个比较每个结点的data域值和x的值,当data不等于x时,进行下一个结点的比较;否则就找到了要删除的结点,删除结点后释放结点。如果到了表尾还没有找到值为x的结点,则链表中没有要删除的元素。

三、实验源代码

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

typedef int ElemType;
#include"LinkedList.h"

void main()
{
	SingleLinkedList *head;
	int i,a,b,c;
	ListInitialize(&head);/*初始化链表*/ 
	for(i=0;i<26;i++)
	    ListInsert(head,i,i+1); 
	printf("链表已生成:\n");    
	for(i=0;i<ListLength(head);i++)
	{
		ListGet(head,i,&a);
		printf("%d ",a);
	}
	/*链表插入操作*/ 
	printf("\n请输入你要插入的数字:\n");
    scanf("%d",&c);
    ListSortInsert(head,c);
	for(i=0;i<ListLength(head);i++)
	{
		ListGet(head,i,&a);
		printf("%d ",a);
	}
	/*链表删除操作*/ 
	printf("\n");
	printf("请输入删除元素:\n");
	scanf("%d",&b);
	
    if(ListDelete(head,b)==1)
	   {
		for(i=0;i<ListLength(head);i++)
		{
			ListGet(head,i,&a);
			printf("%d ",a);
		}
	   }
   else
   	    printf("No!");
	ListDestroy(&head); 
}
 头文件
typedef struct SingleNode
{
	ElemType data;
	struct  SingleNode *next;
} SingleLinkedList,*LinkList;
SingleLinkedList *head;
void ListInitialize (SingleLinkedList * *head)
{
/*如果有内存空间,申请头结点空间并使头指针head指向头结点*/ 
if ((*head=(SingleLinkedList*)malloc(sizeof(SingleLinkedList)))==NULL) exit (1);
(*head) ->next=NULL; /*置链尾标记NULL*/
}
int ListLength(SingleLinkedList *head)
{
	SingleLinkedList *p=head;
	int size=0;
	while(p->next!=NULL)
	{
		p=p->next ;
		size++;
	}
	return size;
}
int ListInsert (SingleLinkedList * head, int i, ElemType x)
{
/*在带头结点的单链表head的数据元素a.(0<i<size)
/*插入一个存放数据元素x的结点*/
SingleLinkedList *p,*q;
int j;
p=head; /*p 指向头结点*/
j=-1; /*j初始为-1*/
while (p->next!=NULL && j<i-1) /*最终让指针p指向a结点*/
{
p=p->next;
j++;
}
if(j!=i-1)
{
printf("插入位置参数错!");
return 0;
}
/*生成新结点由指针q指示*/
if ((q=(SingleLinkedList *) malloc (sizeof (SingleLinkedList)))==NULL)
    exit (1);
q->data=x;
q->next=p->next; /*给指针 q->next 赋值*/
p->next=q; /* 给指针 p->next 重新赋值*/
return 1;
}
int ListGet(SingleLinkedList *head,int i,ElemType *x)
{
	SingleLinkedList *p;
	int j;
	p=head;
	j=-1;
	while(p->next !=NULL&&j<i)
	{
		p=p->next ;
		j++;
	}
	if(j!=i)
	{
		printf("取元素位置参数错误!");
		return 0;
	}
	*x=p->data  ;
	return 1;
}
void ListSortInsert(SingleLinkedList *head,ElemType x)
{
	SingleLinkedList *curr,*pre,*q;
	curr=head->next ;
	pre= head;
	while(curr!=NULL&&curr->data <=x)
	{
		pre=curr;
		curr=curr->next ;
	}
	q=(SingleLinkedList*)malloc(sizeof(SingleLinkedList));
	q->data =x;
	q->next =pre->next ;
	pre->next =q;
}
void ListDestroy(SingleLinkedList **head)
{
	SingleLinkedList *p,*p1;
	p=*head;
	while(p!=NULL)
	{
		p1=p;
		p=p->next ;
		free(p1);
	}
	 *head=NULL;
}
int ListDelete(SingleLinkedList *head,int x)
{
	SingleLinkedList *p,*q;
	p=head;
	while(p->next!=NULL)
	{
		if(p->next->data==x)
		{
			break;
		}
		p=p->next;
	}
	if(p->next==NULL)
	   return 0;
	else
	{
		q=p->next;
		p->next=p->next->next;
		free(q);
		return 1;
	}   
}

四 实验结果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

跳舞的muse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值