PTA-单链表基本操作

请编写程序实现单链表插入、删除结点等基本算法。给定一个单链表和一系列插入、删除结点的操作序列,输出实施上述操作后的链表。单链表数据域值为整数。

输入格式:

输入第1行为1个正整数n,表示当前单链表长度;第2行为n个空格间隔的整数,为该链表n个元素的数据域值。第3行为1个正整数m,表示对该链表施加的操作数量;接下来m行,每行表示一个操作,为2个或3个整数,格式为0 k d或1 k。0 k d表示在链表第k个结点后插入一个数据域值为d的结点,若k=0则表示表头插入。1 k表示删除链表中第k个结点,此时k不能为0。注:操作序列中若含有不合法的操作(如在长度为5的链表中删除第8个结点、删除第0个结点等),则忽略该操作。n和m不超过100000。

输出格式:

输出为一行整数,表示实施上述m个操作后的链表,每个整数后一个空格。输入数据保证结果链表不空。

输入样例:

5
1 2 3 4 5
5
0 2 8
0 9 6
0 0 7
1 0 
1 6

输出样例:

7 1 2 8 3 5 
#include "stdio.h"
#include "malloc.h"
#define Max 100
struct MyStruct
{
	int num;
	struct MyStruct* next;
};
typedef struct MyStruct* List;
List GetList(int n);
List InserList(List head, int k, int d);//k节点d数字
List DelList(List head, int k);
void PrintList(List head);
int main() {
	List head;
	int n, i;
	scanf("%d", &n);
	head = GetList(n);
	scanf("%d", &i);
	while (i) {
		int flag, k, d;
		scanf("%d", &flag);
		if (flag == 0) {
			scanf("%d %d", &k, &d);
			InserList(head, k, d);
		}
		else {
			scanf("%d", &k);
			DelList(head, k);
		}
		i--;
	}
	PrintList(head);
	return 0;
}
//head为空
List GetList(int n) {
	List head = NULL, r = NULL;
	int t, i;
	for (i = 0;i < n;i++) {
		scanf("%d", &t);
		List  p = (List)malloc(sizeof(struct MyStruct));
		p->num = t;
		p->next = NULL;
		if (r == NULL) {
		r = p;
		head= r;
		}
		else {
			r->next = p;
			r = p;
		}
	}
	return head;
}
//0 k d表示在链表第k个结点后插入一个数据域值为d的结点,若k=0则表示表头插入
List InserList(List head, int k, int d) {
	List r = head;
	List p = (List)malloc(sizeof(struct MyStruct));
	p->num = d;
	p->next = NULL;
	int i = 0;
	if (k == 0) {
		p->next = head->next;
        head->next=p;
         p->num=head->num;
        head->num=d;
		return head;
	}
	while (r != NULL && i < k-1) {
		r = r->next;
		i = i + 1;
	}
	if (r == NULL) {
		return head;
	}
	p->next = r->next;
	r->next = p;
	return head;
}
List DelList(List head, int k) {
	int i=1;
    if(k==0){
        return head;
    }
	List r = head, t;
	while (r != NULL && i < k-1 ) {//找k前一个
		r = r->next;
		i = i + 1;
	}
	if (r == NULL) {
		return head;
	}
	t = r->next;
	r->next = t->next;
	free(t);
	return head;
}
void PrintList(List head) {
	while (head) {
		printf("%d ", head->num);
		head = head->next;
	}
}

 

单链表是一种常见的数据结构,它由多个节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。单链表基本操作包括创建、插入、删除、查找和遍历等。下面我们来实现这些操作。 首先,我们需要定义一个单链表的节点类: ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next ``` 接下来,我们定义一个单链表类,其中包含了创建、插入、删除、查找和遍历等操作: ```python class LinkedList: def __init__(self): self.head = None def create(self, lst): if not lst: return None self.head = ListNode(lst[0]) cur = self.head for i in range(1, len(lst)): cur.next = ListNode(lst[i]) cur = cur.next def insert(self, val): if not self.head: self.head = ListNode(val) else: cur = self.head while cur.next: cur = cur.next cur.next = ListNode(val) def delete(self, val): if not self.head: return if self.head.val == val: self.head = self.head.next return cur = self.head while cur.next: if cur.next.val == val: cur.next = cur.next.next return cur = cur.next def search(self, val): cur = self.head while cur: if cur.val == val: return True cur = cur.next return False def traverse(self): cur = self.head while cur: print(cur.val, end=' ') cur = cur.next ``` 其中,`create`操作用于创建单链表,`insert`操作用于在单链表的末尾插入一个节点,`delete`操作用于删除指定值的节点,`search`操作用于查找单链表中是否存在指定值的节点,`traverse`操作用于遍历单链表并输出所有节点的值。 下面是一个示例程序,演示了如何使用上述单链表类实现基本操作: ```python lst = [1, 2, 3, 4, 5] llist = LinkedList() llist.create(lst) llist.traverse() # 输出:1 2 3 4 5 llist.insert(6) llist.traverse() # 输出:1 2 3 4 5 6 llist.delete(3) llist.traverse() # 输出:1 2 4 5 6 print(llist.search(4)) # 输出:True print(llist.search(3)) # 输出:False ``` 以上就是单链表基本操作实验的全部内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值