数据结构大作业

1.线性表的顺序存储

#include <stdio.h>
#define MAXLEN 100
typedef int DataType;

typedef struct {
	DataType data[MAXLEN];
	int Length;
} SeqList;
SeqList L;

void InitList(SeqList *L) {
	L->Length = 0;
}

void CreateList(SeqList *L, int n) {
	int i;
	printf("请输入%d个整数:", n);
	for (i = 0; i < n; i++)
		scanf("%d", &L->data[i]);
	L->Length = i;
}

int GetElem(SeqList *L, int i, DataType *x) {
	if (i < 1 || i > L->Length)
		return 0;
	else {
		*x = L->data[i - 1];
		return 1;
	}
}

int Locate(SeqList *L, DataType x) {
	int i = 0;

	while (i < L->Length && L->data[i] != x)
		i++;

	if (i >= L->Length)
		return 0;
	else
		return i + 1;
}

int InsElem(SeqList *L, int i, DataType x) {
	int j;

	if (L->Length >= MAXLEN) {
		printf("顺序表已满!");
		return -1;
	}

	if (i < 1 || i > L->Length + 1) {
		printf("插入位置出错!");
		return 0;
	}

	if (i == L->Length + 1) {
		L->data[i - 1] = x;
		L->Length++;
		return 1;
	}

	for (j = L->Length - 1; j >= i - 1; j--)

		L->data[j + 1] = L->data[j];
	L->data[i - 1] = x;
	L->Length++;
	return 1;
}

int DelElem(SeqList *L, int i, DataType *x) {
	int j;

	if (L->Length == 0) {
		printf("顺序表为空!");
		return 0;
	}

	if (i < 1 || i > L->Length) {
		printf("不存在第i个元素");
		return 0;
	}

	*x = L->data[i - 1];

	for (j = i; j < L->Length; j++)

		L->data[j - 1] = L->data[j];
	L->Length--;
	return 1;
}

void DispList(SeqList *L) {
	int i;

	for (i = 0; i < L->Length; i++)

		printf("%5d", L->data[i]);
}


void Menu() {
	printf("\n请选择对顺序表的各种操作:");
	printf("\n***********************************************");
	printf("\n               1---建立顺序表                  ");
	printf("\n               2---插入元素                    ");
	printf("\n               3---删除元素                    ");
	printf("\n               4---按位置查找元素              ");
	printf("\n               5---按元素值查找其在表中位置    ");
	printf("\n               6---求顺序表的长度              ");
	printf("\n               0---返回                        ");
	printf("\n***********************************************");
	printf("\n请输入菜单号(0-6):");
}

int main() {
	SeqList L;
	DataType x;
	int n, i, loc;
	char ch1, ch2, a;
	ch1 = 'y';
	while (ch1 == 'y' || ch1 == 'Y') {
		Menu();
		scanf("%c", &ch2);
		getchar();
		switch (ch2) {
			case'1':
					InitList(&L);
				printf("请输入创建线性表的个数:");
				scanf("%d", &n);
				CreateList(&L, n);
				printf("建立的线性表为:");
				DispList(&L);
				break;
			case'2':
					printf("请输入要插入的位置:");
				scanf("%d", &i);
				printf("请输入要插入的元素值:");
				scanf("%d", &x);
				if (InsElem(&L, i, x)) {
					printf("已成功在第%d的位置上插入%d,插入后的线性表为:\n", i, x);
					DispList;
				} else
					printf("输入插入的参数错误!");
				break;

			case '3':
				printf("请输入要删除元素的位置:");
				scanf("%d", &i);

				if (DelElem(&L, i, &x)) {
					printf("已成功在第%d的位置上删除%d,删除后的线性表为:\n", i, x);
					DispList(&L);
				} else
					printf("\n输入删除的参数错误!");
				break;

			case '4':
				printf("请输入要查看表中元素位置(从1开始):");
				scanf("%d", &i);

				if (GetElem(&L, i, &x))
					printf("线性表第%d个元素的值为:%d", i, x);
				else
					printf("输入的位置错误!");
				break;

			case '5':
				printf("请输入要查找的元素值为:");
				scanf("%d", &x);
				loc = Locate(&L, x);

				if (loc)
					printf("查找元素值为%d的位置为:%d", x, loc);
				else
					printf("该表中无此元素!");
				break;

			case '6':
				printf("当前线性表的长度为:%d", L.Length);
				break;

			case '0':
				ch1 = 'n';
				break;

			default:
				printf("输入有误,请输入0~6进行选择!");
		}

		if (ch2 != '0') {
			printf("\n按回车健继续,按任意键返回主菜单!\n");
			a = getchar(
			    );

			if (a != '\xA') {
				getchar();
				ch1 = 'n';
			}

		}
	}
}

2.线性表子系统

/*线性表子系统*/
#include <stdio.h>
#include <malloc.h>

typedef  int  DataType;         /*定义DataType为int类型*/
typedef  struct  linknode {     /*单链表存储类型*/
	DataType       data;         /*定义结点的数据域*/
	struct  linknode   *next;    /*定义结点的指针域*/
} LinkList;

LinkList  *InitList() {
	/*初始化链表函数*/
	LinkList  *head;
	head = (LinkList *)malloc(sizeof(LinkList)); /*动态分配一个结点空间*/
	head->next = NULL;
	return head;                    /*头结点L指针域为空,表示空链表*/
}

void CreateListH(LinkList  *head, int n) {
	/*头插法建立链表函数*/
	LinkList  *s;
	int i;
	printf("请输入%d个整数:", n);
	for (i = 0; i < n; i++) {
		s = (LinkList *)malloc(sizeof(LinkList));  /*生成新结点*/
		scanf("%d", &s->data);                     /*读入新结点的数据域*/
		s->next = head->next;            /*将新结点的指针域存放头结点的指针域*/
		head->next = s;                  /*将新结点插入头结点之后*/
	}
	printf("建立链表操作成功!");
}

void CreateListL(LinkList  *head, int n) {
	/*尾插法建立链表函数*/
	LinkList  *s, *last;
	int i;
	last = head;                   /*last始终指向尾结点,开始时指向头结点*/
	printf("请输入%d个整数:", n);
	for (i = 0; i < n; i++) {
		s = (LinkList *) malloc(sizeof(LinkList)); /*生成新结点*/
		scanf("%d", &s->data);           /*读入新结点的数据域*/
		s->next = NULL;         /*将新结点的指针域为空*/
		last->next = s;         /*将新结点插入表尾*/
		last = s;               /*将last指针指向表尾结点*/
	}
	printf("建立链表操作成功!");
}

int  LengthList(LinkList  *head) {
	/*求链表长度函数*/
	LinkList  *p = head->next;
	int j = 0;
	while (p != NULL) { /*当p不指向链表尾时*/
		p = p->next;
		j++;
	}
	return  j;
}

void Locate(LinkList  *head, DataType x) {
	/*在链表中查找值为x的元素位置*/
	int  j = 1;                     /*计数器*/
	LinkList  *p;
	p = head->next;
	while (p != NULL  &&  p->data != x) { /*查找及定位*/
		p = p->next;
		j++;
	}
	if (p != NULL)
		printf("在表的第%d位找到值为%d的结点!", j, x);
	else
		printf("未找到值为%d的结点!", x);
}

void SearchList(LinkList *head, int i) {
	/*在链表中按位置查找元素*/
	LinkList  *p;
	int j = 0;
	p = head;                        /*p指向链表的头结点*/
	if (i > LengthList(head))
		printf("位置错误,链表中没有该位置!");
	while (p->next != NULL && j < i) {
		p = p->next;
		j++;
	}
	if (j == i)                  /*判断与给定的序号是否相等*/
		printf("在第%d位上的元素值为%d!", i, p->data);
}

void InsList(LinkList  *head, int i, DataType x) {
	/*按位置插入元素函数*/
	int j = 0;
	LinkList  *p, *s;
	p = head;
	while (p->next != NULL && j < i - 1) { /*定位插入点*/
		p = p->next;
		j++;
	}
	if (p != NULL) {   /*p不为空则将新结点插到p后*/
		s = (LinkList *)malloc(sizeof(LinkList)); /*生成新结点s*/
		s->data = x;                 /*将数据x放入新结点的数据域*/
		s->next = p->next;           /*将新结点s的指针域与p结点后面元素相连*/
		p->next = s;                 /*将p与新结点s链接*/
		printf("插入元素成功!");
	} else
		printf("插入元素失败");
}

void DelList(LinkList  *head, int i) {
	/*按位置删除链表中元素函数*/
	int j = 0;
	DataType x;
	LinkList  *p = head, *s;
	while (p->next != NULL && j < i - 1) { /*定位插入点*/
		p = p->next;
		j++;
	}
	if (p->next != NULL && j == i - 1) {
		s = p->next;                  /*q为要删除结点*/
		x = s->data;                 /*将要删除的数据放入指针变量x中*/
		p->next = s->next;            /*将p结点的指针域与q结点后面元素相连*/
		free(s);
		printf("删除第%d位上的元素%d成功!", i, x);
	} else
		printf("删除结点位置错误,删除失败!");
}

void DispList(LinkList *head) {
	/*显示输出链表函数*/
	LinkList *p;
	p = head->next;
	while (p != NULL) {
		printf("%5d", p->data);
		p = p->next;
	}
}

void MenuLine() {
//	显示菜单子函数
	printf("\n线性表子系统");
	printf("\n***********************************************");
	printf("\n               1---建立                 ");
	printf("\n               2---插入                 ");
	printf("\n               3---删除                 ");
	printf("\n               4---按位置查找           ");
	printf("\n               5---按元素值查找         ");
	printf("\n               6---求表长               ");
	printf("\n               0---返回                 ");
	printf("\n***********************************************");
	printf("\n请输入菜单号(0-6):");
}

int main() {
	LinkList *head;
	DataType x;
	int i, n;
	char ch1, ch2, a;
	ch1 = 'y';
	while (ch1 == 'Y' || ch1 == 'y') {
		MenuLine();
		scanf("%c", &ch2);
		getchar();
		switch (ch2) {
			case '1':
				head = InitList();
				printf("请输入要建立线性表的长度:");
				scanf("%d", &n);
				CreateListL(head, n);
				printf("建立后的线性表为:\n");
				DispList(head);
				break;

			case '2':
				printf("请输入要插入的元素位置:");
				scanf("%d", &i);
				getchar();
				printf("请输入要插入的元素值:");
				scanf("%d", &x);
				InsList(head, i, x);
				printf("插元素%d后的线性表为:\n", x);
				DispList(head);
				break;

			case '3':
				printf("请输入要删除元素的位置:");
				scanf("%d", &i);
				DelList(head, i);
				printf("删除第%d位的元素后的线性表为:\n", i);
				DispList(head);
				break;

			case '4':
				printf("请输入查找的元素位置(大于等于1的整数):");
				scanf("%d", &i);
				SearchList(head, i);
				break;

			case '5':
				printf("请输入要查找的整数:");
				scanf("%d", &x);
				Locate(head, x);
				break;

			case '6':
				printf("链表的长度为:%d\n", LengthList(head));
				break;

			case '0':
				ch1 = 'n';
				break;

			default:
				printf("输入有误,请输入0-9进行选择!");
		}

		if (ch2 != '0') {
			printf("\n按回车键继续,按任意键返回主菜单!\n");
			a = getchar();
			if (a != '\xA') {
				getchar();
				ch1 = 'n';
			}
		}
	}
}

3.完成算法void dellAll(SeqList *L,int n)删除顺序表中,值为n的所有结点

#include <stdio.h>
#define  MAXLEN  100           /*定义常量MAXLEN为100表示存储空间总量*/

typedef  int  DataType;          /*定义ElemType为int类型*/
typedef  struct {                /*顺序表存储类型*/
	DataType   data[MAXLEN];     /*存放线性表的数组*/
	int  Length;                 /*Length是顺序表的长度*/
} SeqList;

void  InitList( SeqList  *L ) {
	/*初始化顺序表L函数*/
	L->Length = 0;                   /*初始化顺序表为空*/
}

void CreateList(SeqList *L, int n) {
	/*建立顺序表并输入多个元素函数*/
	int i;
	printf("请输入%d个整数:", n);
	for ( i = 0; i < n; i++) {
		scanf("%d", &L->data[i]);
	}
	L->Length = i;
	/*设线性表的长度为i*/
}

void DispList(SeqList *L) {
	/*显示输出顺序表L的每个元素函数*/
	int i;
	for (int a = 0; a < L->Length; a++) {
		printf("%5d", L->data[a]);
	}
}

//题目要求完成dellAll函数:
void dellAll(SeqList *L, int n) {
	int p, j;
	for (int i = 1; i < L->Length + 1; i++) {
		if (L->data[i - 1] == n) {
			p = i;
			j = i;
			for (int a = 1; a < L->Length - j + 1; a++, i++)
				L->data[i - 1] = L->data[i];
			L->Length = L->Length - 1;
			i = p;
		}
	}
}

int main() {
	//1.void  InitList( SeqList  *L )
	SeqList list;
	InitList( &list );
	printf("\n\n");

	//2.void CreateList(SeqList *L,int n)
	int n;
	puts("请输入要输入元素的数量:");
	scanf("%d", &n);
	CreateList(&list, n);
	printf("\n\n");

	//3.void DispList(SeqList *L)
	DispList(&list);
	printf("\n\n");
	printf("%d", list.Length);
	DataType number;
	puts("请输入要删除元素值:");
	scanf("%d", &number);
	dellAll(&list, number);
	DispList(&list);

}

4.完成void ABBA(LinkList *head) int count(LinkList *head , int x)

//完成void ABBA(LinkList *head) int count(LinkList *head , int x)
/*线性表子系统*/
#include <stdio.h>
#include <malloc.h>

typedef  int  DataType;         /*定义DataType为int类型*/
typedef  struct  linknode {     /*单链表存储类型*/
	DataType       data;         /*定义结点的数据域*/
	struct  linknode   *next;    /*定义结点的指针域*/
} LinkList;

LinkList  *InitList() {
	/*初始化链表函数*/
	LinkList  *head;
	head = (LinkList *)malloc(sizeof(LinkList)); /*动态分配一个结点空间*/
	head->next = NULL;
	return head;                    /*头结点L指针域为空,表示空链表*/
}

void CreateListL(LinkList  *head, int n) {
	/*尾插法建立链表函数*/
	LinkList  *s, *last;
	int i;
	last = head;                   /*last始终指向尾结点,开始时指向头结点*/
	printf("请输入%d个整数:", n);
	for (i = 0; i < n; i++)   {
		s = (LinkList *) malloc(sizeof(LinkList)); /*生成新结点*/
		scanf("%d", &s->data);           /*读入新结点的数据域*/
		s->next = NULL;         /*将新结点的指针域为空*/
		last->next = s;         /*将新结点插入表尾*/
		last = s;               /*将last指针指向表尾结点*/
	}
	printf("建立链表操作成功!");
}

int  LengthList(LinkList  *head) {
	/*求链表长度函数*/
	LinkList  *p = head->next;
	int j = 0;
	while (p != NULL) { /*当p不指向链表尾时*/
		p = p->next;
		j++;
	}
	return  j;
}

void DispList(LinkList *head) {
	/*显示输出链表函数*/
	LinkList *p;
	p = head->next;
	while (p != NULL) {
		printf("%5d", p->data);
		p = p->next;
	}
}

//完成函数实现逆置带头单链表
void ABBA(LinkList *head) {
	LinkList *p, *q;
	p = head->next;
	head->next = NULL;
	while (p != NULL) {
		q = p;
		p = p->next;
		q->next = head->next;
		head->next = q;
	}
}

//完成函数计算单链表中值为x的结点的个数
int count(LinkList *head, int x) {
	LinkList *p;
	int n = 0;
	p = head;
	while (p != NULL) {
		if (p->data == x)
			n++;
		p = p->next;
	}
	return n;
}

int main() {
	LinkList *head;
	//1.LinkList  *InitList()
	head = InitList();
	puts("链表初始化结束");

	//2.void CreateListL(LinkList  *head,int n)正顺
	int n ;
	puts("请输入一个整数:");
	scanf("%d", &n);
	CreateListL(head, n);
	printf("\n\n");

	//void DispList(LinkList *head)
	DispList(head);
	printf("\n\n");

	//3.int  LengthList(LinkList  *head)
	int length;
	length = LengthList(head);
	printf("链表的长度为:%d \n\n", length);

	//4.void ABBA(LinkList *head)
	ABBA(head);

	DispList(head);
	printf("\n\n");

	//5.int count(LinkList *head , int x)
	int number, x;
	puts("请输入要统计的值:");
	scanf("%d", &x);
	number = count(head, x);
	printf("number = %d \n", number);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值