5.18作业

双向链表代码:

head.h

#ifndef __HEAD3_H__
#define __HEAD3_H__

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

typedef struct double_list {
	union {
		int len;
		int data;
	};
	struct double_list *next;
	struct double_list *prev;
}*double_list_t;

void menue();
double_list_t get_space(int flag);
int insert_head(double_list_t L,int n);
int output(double_list_t L);
int delete_pos(double_list_t L,int pos);
int modify_pos(double_list_t L,int pos);
int find_pos(double_list_t L,int pos);

#endif

head.c

#include "head3.h"
//创建菜单
void menue(){
	puts("1,头插");
	puts("2,输出");
	puts("3,按位置删除");
	puts("4,按位置修改");
	puts("5,按位置查找");
}
//创建结点
double_list_t get_space(int flag){
	double_list_t L=(double_list_t)malloc(sizeof(struct double_list));
	if(NULL==L){
		return NULL;
	}
	if(1==flag){
		L->len=0;
		L->next=NULL;
		L->prev=NULL;
	}else if(0==flag){
		L->next=NULL;
		L->prev=NULL;
	}
	return L;
}
//头插
int insert_head(double_list_t L,int n){
	if(NULL==L){
		printf("表不存在\n");
		return -1;
	}
	int i;
	for(i=0;i<n;i++){
		double_list_t new=get_space(0);
		new->next=L->next;
		new->prev=L;
		if(L->next!=NULL){
			L->next->prev=new;
		}
		L->next=new;
		int value;
		printf("请输入插入的值:");
		scanf("%d", &value);
		new->data=value;
		L->len++;
	}
	printf("插入完成\n");
	return 0;
}
//输出
int output(double_list_t L){
	if(NULL==L){
		printf("表不存在\n");
		return -1;
	}
	if(L->next==NULL){
		printf("表为空\n");
		return -1;
	}
	double_list_t temp=L;
	while(temp->next!=NULL){
		temp=temp->next;
		printf("%d\t", temp->data);
	}
	puts("");
	return 0;
}
//按位置删除
int delete_pos(double_list_t L,int pos){
	if(NULL==L){
		printf("表不存在\n");
		return -1;
	}
	if(L->next==NULL){
		printf("表为空\n");
		return -1;
	}
	if(pos<1||pos>L->len+1){
		printf("位置输入错误\n");
		return -1;
	}
	double_list_t temp=L;
	int i;
	for(i=0;i<pos-1;i++){
		temp=temp->next;
	}
	double_list_t temp1=temp->next;
	temp->next=temp1->next;
	if(temp1->next!=NULL){
		temp1->next->prev=temp;
	}
	free(temp1);
	temp1=NULL;
	L->len--;
	return 0;
}
//按位置修改
int modify_pos(double_list_t L,int pos){
	if(NULL==L){
		printf("表不存在\n");
		return -1;
	}
	if(L->next==NULL){
		printf("表为空\n");
		return -1;
	}
	if(pos<1||pos>L->len){
		printf("位置输入错误\n");
		return -1;
	}
	double_list_t temp=L;
	int i;
	for(i=0;i<pos;i++){
		temp=temp->next;	
	}
	int value;
	printf("请输入修改的值:");
	scanf("%d", &value);
	temp->data=value;
	printf("修改成功\n");
	return 0;
}
//按位置查找
int find_pos(double_list_t L,int pos){
	if(NULL==L){
		printf("表不存在\n");
		return -1;
	}
	if(L->next==NULL){
		printf("表为空\n");
		return -1;
	}
	if(pos<1||pos>L->len){
		printf("位置输入错误\n");
		return -1;
	}
	double_list_t temp=L;
	int i;
	for(i=0;i<pos;i++){
		temp=temp->next;
	}
	printf("查找的值为:%d\n", temp->data);
	return 0;
}

main.c

#include "head3.h"
int main(int argc, const char *argv[])
{
	menue();
	//创建头结点
	double_list_t L=get_space(1);
	int number;
	while(1){
		printf("请输入选项:");
		scanf("%d", &number);
		switch(number){
			case 1://头插
				{
					int n;
				   printf("请输入插入的个数:");
				   scanf("%d", &n);
				   insert_head(L,n);
				}break;
			case 2://输出
				{
					output(L);
				}break;
			case 3:
				{
					int pos;
					printf("请输入删除的位置:");
					scanf("%d", &pos);
					delete_pos(L,pos);
				}break;
			case 4:
				{
					int pos;
					printf("请输入修改的位置:");
					scanf("%d", &pos);
					modify_pos(L,pos);
				}break;
			case 5:
				{
					int pos;
					printf("请输入查找的位置:");
					scanf("%d", &pos);
					find_pos(L,pos);
				}break;
			default:printf("输入错误,请重新输入\n");break;
			case 0:printf("退出程序\n");exit(0);
		}
	}
	return 0;
}

双向循环链表代码:

head.h

#ifndef __HEAD2_H__
#define __HEAD2_H__

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

typedef struct doublerun_list {
	union {
		int len;
		int data;
	};
	struct doublerun_list *next;
	struct doublerun_list *prev;
}*doublerun_list_t;

void menue();
doublerun_list_t get_space(int flag);
int insert_head(doublerun_list_t L,int n);
int output(doublerun_list_t L);
int delete_head(doublerun_list_t L);
int insert_rear(doublerun_list_t L,int n);
int delete_rear(doublerun_list_t L);
#endif

head.c

#include "head2.h"
//创建菜单
void menue(){
	puts("1,头插");
	puts("2,输出");
	puts("3,头删");
	puts("4,尾插");
	puts("5,尾删");
}
//创建结点
doublerun_list_t get_space(int flag){
	doublerun_list_t L=(doublerun_list_t)malloc(sizeof(struct doublerun_list));
	if(NULL==L){
		return NULL;
	}
	if(1==flag){
		L->len=0;
		L->next=L;
		L->prev=L;
	}else if(0==flag){
		L->next=NULL;
		L->prev=NULL;
	}
	return L;
}	
//头插
int insert_head(doublerun_list_t L,int n){
	if(NULL==L){
		printf("表不存在\n");
		return -1;
	}
	int i;
	for(i=0;i<n;i++){
		doublerun_list_t new=get_space(0);
		if(NULL==new){
			printf("创建结点失败\n");
			return -1;
		}
		new->next=L->next;
		new->prev=L;
		if(L->next!=L){
			L->next->prev=new;
		}
		L->next=new;
		int value;
		printf("请输入插入的值:");
		scanf("%d", &value);
		new->data=value;
		L->len++;
	}
	printf("插入完成\n");
	return 0;
}
//输出
int output(doublerun_list_t L){
	if(NULL==L){
		printf("表不存在\n");
		return -1;
	}
	if(L->next==L){
		printf("表为空\n");
		return -1;
	}
	doublerun_list_t temp=L;
	while(temp->next!=L){
		temp=temp->next;
		printf("%d\t", temp->data);
	}
	puts("");
	return 0;
}
//头删
int delete_head(doublerun_list_t L){
	if(NULL==L){
		printf("表不存在\n");
		return -1;
	}
	if(L->next==L){
		printf("表为空\n");
		return -1;
	}
	doublerun_list_t temp=L->next;
	L->next=temp->next;
	temp->next->prev=L;
	L->len--;
	return 0;
}
//尾插
int insert_rear(doublerun_list_t L,int n){
	if(NULL==L){
		printf("表不存在\n");
		return -1;
	}
	doublerun_list_t temp=L;
	int i;
	for(i=0;i<n;i++){
		while(temp->next!=L){
			temp=temp->next;
		}
		doublerun_list_t new=get_space(0);
		new->next=L;
		new->prev=temp;
		temp->next=new;
		L->prev=new;
		int value;
		printf("请输入插入的值:");
		scanf("%d", &value);
		new->data=value;
		L->len++;
	}
	return 0;
}
//尾删
int delete_rear(doublerun_list_t L){
	if(NULL==L){
		printf("表不存在\n");
		return -1;
	}
	if(L->next==L){
		printf("表为空\n");
		return -1;
	}
	doublerun_list_t temp=L;
	while(temp->next->next!=L){
		temp=temp->next;
	}
	doublerun_list_t temp1=temp->next;
	temp->next=L;
	L->prev=temp;
	free(temp1);
	temp1=NULL;
	L->len--;
	printf("删除成功\n");
	return 0;
}

main.c

int main(int argc, const char *argv[])
{
	//创建头结点
	doublerun_list_t L=get_space(1);
	menue();
	int number;
	while(1){
		printf("请输入选项:");
		scanf("%d", &number);
		switch(number){
		case 1://头插
			{
				int n;
				printf("请输入插入的个数:");
				scanf("%d", &n);
				insert_head(L,n);
			}break;
		case 2:
			{//输出
			   	output(L);
			}break;
		case 3:
			{//头删
				int n,i;
				printf("请输入删除的个数:");
				scanf("%d", &n);
				for(i=0;i<n;i++){
					delete_head(L);
				}
				printf("删除成功\n");
			}break;
		case 4://尾插
			{
				int n;
			   	printf("请输入插入的个数");
				scanf("%d", &n);
				insert_rear(L,n);
			}break;
		case 5:
			{
				delete_rear(L);   
			}break;
		default:printf("输入错误,请重新输入\n");break;
		case 0:printf("退出程序\n");exit(0);
		}
	}
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值