单链表–在第i个位置前插入新元素/在第j个位置删除一个元素

  • Post author:
  • Post category:其他


实验内容


建立带头节点的单链表,编写算法,在第i个位置前插入一个新元素,在第j个位置删除一个元素


运行过程:



手动输入单链表长度并且依次赋值,头节点存放单链表长度

展示单链表(包括头结点)



switch case 选择操作

效果图:

完整代码:

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

struct node {
	int data;      //数据域
	struct node *next; //指针域
};

// 在第i个元素之前插入数据元素e
int ListInsert_N(node *N,int x,int y) {
	struct node *P,*S;
	P = N;
	S=(struct node *)malloc(1*sizeof(struct node));
	int J = 0;
	while (P && J < x - 1 ) {
		P = P->next;
		++J;
	}
	if (!P || J > x ) {
		printf("数据不合法");
		return 0;
	}
	S->data = y;
	S->next = P->next;
	P->next = S;
	P = N->next;
	while(P) {

		printf("%d\t",P->data);
		P=P->next;
	}
	printf("\n");
	return 0;

}

//单链表 删除第i个结点 返回所删除的数据
int ListDelete_N(node *N,int x,int num) {
	if(x>num){
		printf("数据不合法");
		return 0;
	}
	struct node *P,*S;
	P = N;
	S=(struct node *)malloc(1*sizeof(struct node));
	int J = 0;
	while (P&& J < x - 1) {
		P = P->next;
		++J;
	}
	if (!(P->next) || J > x) {
		printf("数据不合法");
		return 0;
	}
	S = P->next;
	P->next = S->next;
	printf("删除元素:%d\n",S->data);
	free(S);
	P = N->next;
	printf("剩余元素:");
	while(P) {

		printf("%d\t",P->data);
		P=P->next;
	}
	return 0;
};

int main() {
	int i,num,x,y;
	char choose;
	struct node *head ,*N;
	//生成一个有头节点链表
	head=(struct node *)malloc(1*sizeof(struct node));
	N=head;
	printf("请输入该链表元素个数:") ;
	scanf("%d",&num);
	N->data=num;
	for(i=0; i<num; i++) {
		N->next = (struct node *)malloc(1*sizeof(struct node));
		N = N->next;
		printf("请为节点%d赋值值:",i+1);
		scanf("%d",&N->data);
	}
	//尾结点next为NULL
	N->next = NULL;
	// 重新设置N的指向;
	N=head;
	printf("生成的单链表为:");
	while(N) {

		printf("%d\t",N->data);
		N=N->next;
	}
	N=head;

	while(1) {
		printf("\n\n\t\t请选择服务种类:");
		printf("\n\n\t\t(A/a):插入元素");
		printf("\n\n\t\t(B/b):删除元素");
		printf("\n\n\t\t(C/c):退出\n");
		scanf("\t\t\t%s", &choose);
		switch (choose) {
			case'A':
			case'a': {
				printf("\n在x位置插入数据y:");
				scanf("%d,%d",&x,&y);
				ListInsert_N(N,x,y);
				break;
			}
			case'B':
			case'b': {
				printf("\n在x位置删除数据:");
				scanf("%d,%d",&x);
				ListDelete_N(N,x,num);
				break;
			}
			case'C':
			case'c': {
				return 0;
				break;
			}
			default :
				printf("输入不合法");
				break;

		}
	}

	return 0;
}


初学数据结构,写的不好,对指针的使用也不是特别熟练,望见谅



版权声明:本文为find1star原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。