您的位置:首页 > 理论基础 > 数据结构算法

数据结构实验二:单链表

2015-09-18 10:58 211 查看
代码实现的单链表的一些常规操作,如下。(代码中调用了自定义的table.h,后面有)

/***************************************** 
Copyright (c) 2015 Jingshuang Hu 
 
@filename:demo.c 
@datetime:2015.09.18 
@author:HJS 
@e-mail:eleftheria@163.com 
@blog:http://blog.csdn.net/hujingshuang 
*****************************************/

#include "table.h"
/****************************************/
int main()
{
	LinkList p = NULL;

	int num = 0, pos = 0, value = 0, value1 = 0, value2 = 0;
	List_Init(&p);
	while(1)
	{
		List_Menu();
		scanf("%d", &num);
		switch(num)
		{
			case 1:
				printf("插入位置:");
				scanf("%d", &pos);
				printf("插入值:");
				scanf("%d", &value);
				List_Insert(p, pos, value);
				break;
			case 2:
				printf("删除位置:");
				scanf("%d", &pos);
				List_Delete_Pos(p, pos);
				break;
			case 3:
				printf("删除元素:");
				scanf("%d", &value);
				List_Delete_Elem(p, value);
				break;
			case 4:
				printf("替换位置:");
				scanf("%d", &pos);
				printf("替换成:");
				scanf("%d", &value);
				List_Replace_Pos(p, pos, value);
				break;
			case 5:
				printf("替换元素:");
				scanf("%d", &value1);
				printf("替换成:");
				scanf("%d", &value2);
				List_Replace_Elem(p, value1, value2);
				break;
			case 6:
				printf("查找位置:");
				scanf("%d", &pos);
				List_Find_Pos(p, pos);
				break;
			case 7:
				printf("查找值:");
				scanf("%d", &value);
				List_Find_Elem(p, value);
				break;
			case 8:
				List_Show_Length(p);
				break;
			case 9:
				List_Destroy(p);
				break;
			case 10:
				printf("\n程序结束!\n");
				return 0;
				break;
		}
		List_Show_All(p);
		getchar();getchar();
		system("cls");
	}
	return 0;
}
其中table.h是有关单链表的结构体定义及函数声明,代码如下:

/***************************************** 
Copyright (c) 2015 Jingshuang Hu 
 
@filename:table.h 
@datetime:2015.09.18 
@author:HJS 
@e-mail:eleftheria@163.com 
@blog:http://blog.csdn.net/hujingshuang 
*****************************************/

#ifndef _TABLE_H_
#define _TABLE_H_
/***************************************************/
#include <stdio.h>
#include <stdlib.h>
/***************************************************/
typedef struct node
{
	int data;
	struct node *next;
}Lnode, *LinkList;
/***************************************************/
void List_Menu(void);
void List_Init(LinkList *h);
void List_Insert(LinkList h, int pos, int value);
void List_Delete_Pos(LinkList h, int pos);
void List_Delete_Elem(LinkList h, int value);
void List_Find_Pos(LinkList h, int pos);
void List_Find_Elem(LinkList h, int value);
void List_Replace_Pos(LinkList h, int pos, int value);
void List_Replace_Elem(LinkList h, int value1, int value2);
void List_Show_All(LinkList h);
void List_Show_Length(LinkList h);
void List_Destroy(LinkList h);
/***************************************************/
#endif
table.ctable.h函数的具体实现,代码如下:

/****************************************************
Copyright (c) 2015 Jingshuang Hu 
 
@filename:table.c
@datetime:2015.09.18 
@author:HJS 
@e-mail:eleftheria@163.com 
@blog:http://blog.csdn.net/hujingshuang 
****************************************************/

#include "table.h"
/***************************************************/
void List_Menu(void)
{
	printf("\n************单链表菜单************\n");
	printf("1.插入元素\n");
	printf("2.按位置删除\t3.按元素删除\n");
	printf("4.按位置替换\t5.按元素替换\n");
	printf("6.按位置查找\t7.按元素查找\n");
	printf("8.查看表长\t9.销毁表\n");
	printf("10.退出程序\n");
	printf("**********************************\n");
	printf("请选择:");
}
/***************************************************/
void List_Init(LinkList *h)//二级指针
{
	*h = (LinkList)malloc(sizeof(Lnode));//生成头结点
	if (!h)
	{
		printf("链表初始化失败!\n");
	}
	(*h)->next = NULL;//头结点的指针域置为空
}
/*******************插值(前插)********************/
void List_Insert(LinkList h, int pos, int value)
{
	LinkList p = h, q;
	int i = 0;
	if (!p->next && pos == 1)//表为空
	{
		q = (LinkList)malloc(sizeof(Lnode));
		if (!q)
		{
			printf("不能生成新的节点!\n");
		}
		q->data = value;
		q->next = p->next;
		p->next = q;	
	}
	else
	{
		while(p->next && i < pos - 1)
		{
			p = p->next;
			i++;
		}
		if (!p->next || i > pos - 1)
		{
			printf("位置不合法!\n");
		}
		else
		{
			q = (LinkList)malloc(sizeof(Lnode));
			if (!q)
			{
				printf("不能生成新的节点!\n");
			}
			q->data = value;
			q->next = p->next;
			p->next = q;
		}
	}
}
/********************删除***************************/
void List_Delete_Pos(LinkList h, int pos)
{
	LinkList p = h, q;
	int i = 0;
	while(p->next && i < pos - 1)
	{
		p = p->next;
		i++;
	}
	if (!p->next || i > pos - 1)
	{
		printf("位置不合法!\n");
	}
	else
	{
		q = p->next;
		p->next = q->next;
		printf("删除元素为:%d\n", q->data);
		free(q);
	}
}
/***************************************************/
void List_Delete_Elem(LinkList h, int value)
{
	LinkList p = h, q;
	int i = 0, flag = 0;
	while(p->next)
	{
		if (p->next->data == value)
		{
			flag++;
			q = p->next;
			p->next = p->next->next;
			free(q);
		}
		else
		{
			p = p->next;
		}
	}
	if (flag)
	{
		printf("元素%d删除完毕!\n", value);
	}
	else
	{
		printf("未发现元素%d\n", value);
	}
}
/**********************替换*************************/
void List_Replace_Pos(LinkList h, int pos, int value)
{
	LinkList p = h->next;
	int i = 0;
	while(p && i < pos - 1)
	{
		p = p->next;
		i++;
	}
	if (!p || i > pos - 1)
	{
		printf("位置不合法!\n");
	}
	else
	{
		p->data = value;
	}
}
/***************************************************/
void List_Replace_Elem(LinkList h, int value1, int value2)
{
	LinkList p = h->next;
	int flag = 0;
	while(p)
	{
		if (p->data == value1)
		{
			flag++;
			p->data = value2;
		}
		p = p->next;
	}
	if (flag)
	{
		printf("已将%d替换成%d\n", value1, value2);
	}
	else
	{
		printf("未发现元素%d\n", value1);
	}
}
/********************查找**************************/
void List_Find_Pos(LinkList h, int pos)
{
	LinkList p = h->next;
	int i = 0;
	while(p && i < pos - 1)
	{
		i++;
		p = p->next;
	}
	if (!p || i > pos - 1)
	{
		printf("位置不合法!\n");
	}
	else
	{
		printf("%d\n", p->data);
	}
}
/***************************************************/
void List_Find_Elem(LinkList h, int value)
{
	LinkList p = h->next;
	int i = 0, flag = 0;
	while(p)
	{
		i++;
		if (p->data == value)
		{
			flag++;
			printf("%d ", i);
		}
		p = p->next;
	}
	printf("共查找到%d个元素\n", flag);
}
/********************显示***************************/
void List_Show_All(LinkList h)
{
	LinkList p = h->next;
	if (!p)
	{
		printf("表空!\n");
	}
	else
	{
		while(p)
		{
			printf("%d ", p->data);
			p = p->next;
		}
		printf("\n");
	}
}
/***************************************************/
void List_Show_Length(LinkList h)
{
	int len = 0;
	LinkList p = h->next;
	while(p)
	{
		len++;
		p = p->next;
	}
	printf("length=%d\n", len);
}
/**********************销毁*************************/
void List_Destroy(LinkList h)
{
	LinkList p = h, q;

	while(p->next)
	{
		q = p->next;
		p->next = q->next;
		free(q);
	}
}


上述代码完好,均可copy使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: