(1)编写程序 c12-3.c,实现单链表的相关操作。 假设有如下定义的单链表结点: struct List { int num; char name[20]; struct List *next; }; 编程实现如下功能: ① 创建单链表,函数原型为: struct List * H_creat_list(); 函数返回单链表的头结点地址。 ② 输出单链表,函数原型为: void print(struct List *head); 其中,head 为单链表的头指针。 ③ 在一个单链表中指定的位置 k 插入一个结点,函数原型为: struct List *insert_Node_k(struct List *head, int num ,char name[],int k); 其中,head 为单链表的头指针,num 和 name[]为待插入的学号和姓名,函数返回插入后的 单链表的头结点的指针。 ④ 删除单链表中学号为 x 的结点 struct List *Del_Node_x(struct List *head,int x); 其中,head 为单链表的头指针,函数返回删除后的单链表的头结点的指
时间: 2024-03-09 14:50:05 浏览: 60
好的,下面是 c12-3.c 的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct List
{
int num;
char name[20];
struct List *next;
};
// 创建单链表
struct List *H_creat_list()
{
struct List *head, *p, *q;
int n, i;
head = (struct List*)malloc(sizeof(struct List));
head->next = NULL;
printf("请输入学生人数:");
scanf("%d", &n);
q = head;
for(i=0; i<n; i++)
{
p = (struct List*)malloc(sizeof(struct List));
printf("请输入学号和姓名:");
scanf("%d%s", &p->num, p->name);
p->next = NULL;
q->next = p;
q = p;
}
return head;
}
// 输出单链表
void print(struct List *head)
{
struct List *p = head->next;
printf("学号\t姓名\n");
while(p)
{
printf("%d\t%s\n", p->num, p->name);
p = p->next;
}
}
// 在指定位置k插入结点
struct List *insert_Node_k(struct List *head, int num, char name[], int k)
{
struct List *p = head->next, *q, *newNode;
int i = 1;
while(p && i < k)
{
p = p->next;
i++;
}
if(!p || i > k)
{
printf("插入位置无效!\n");
return head;
}
newNode = (struct List*)malloc(sizeof(struct List));
newNode->num = num;
strcpy(newNode->name, name);
q = p->next;
p->next = newNode;
newNode->next = q;
return head;
}
// 删除学号为x的结点
struct List *Del_Node_x(struct List *head, int x)
{
struct List *p = head->next, *q = head;
while(p)
{
if(p->num == x)
{
q->next = p->next;
free(p);
return head;
}
q = p;
p = p->next;
}
printf("未找到该学生!\n");
return head;
}
int main()
{
struct List *head, *newHead;
int x;
// 创建单链表
head = H_creat_list();
// 输出单链表
printf("创建的单链表为:\n");
print(head);
// 在指定位置插入结点
newHead = insert_Node_k(head, 101, "Tom", 3);
printf("在指定位置插入结点后的单链表为:\n");
print(newHead);
// 删除指定结点
printf("请输入要删除的学生学号:");
scanf("%d", &x);
newHead = Del_Node_x(newHead, x);
printf("删除指定结点后的单链表为:\n");
print(newHead);
return 0;
}
```
运行程序,可以创建单链表、输出单链表、在指定位置插入结点、删除指定结点,并输出相应的结果。
阅读全文