一、实验目的:
1、掌握链表的基本运算;
2、掌握链式存储的概念,学会对链式存储数据结构进行操作;
3、加深对链式存储数据结构的理解,逐步培养解决实际问题的编程能力。
二:练习内容和要求:
1、编写函数,创建一个链表(数据自拟);
2、编写函数,在链表的指定位置插入一个元素;
3、编写函数,在链表的指定位置删除一个元素;
三:源代码
#include<stdio.h>
#include<malloc.h>
typedef int DataType;
typedef struct linknode {
DataType data;
struct linknode *next;
} LinkList;
LinkList *InitList() {
LinkList *head;
head = (LinkList *) malloc(sizeof(LinkList));
head->next = NULL;
return head;
}
void CreatListH(LinkList *head, int n) {
LinkList *s;
int i;
printf("请输入%d个整数\n", n);
for (i = 0; i < n; i++) {
s = (LinkList *) malloc(sizeof(LinkList));
scanf("%d", &s->data);
s->next = head->next;
head->next = s;
}
printf("建表成功\n");
}
int LengthList(LinkList *head) {
LinkList *p = head->next;
int j = 0;
while (p != NULL) {
p = p->next;
j++;
}
return j;
}
int OutList(LinkList *head, int position) {
int i = 0;
LinkList *p;
p = head->next;
while (i < position) {
p = p->next;
i++;
}
return p->data;
}
void DelList(LinkList *head, int position) {
int x, j = 0;
LinkList *p = head, *s;
while (p->next != 0 && j < position - 1) {
p = p->next;
j++;
}
if (p->next != NULL && j == position - 1) {
s = p->next;
x = s->data;
p->next = s->next;
free(s);
printf("删除第%d位上的元素%d成功\n", position, x);
} else {
printf("删除结点位置错误,删除失败");
}
}
void DispList(LinkList *head) {
LinkList *p;
p = head->next;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
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->data = x;
s->next = p->next;
p->next = s;
printf("插入元素成功!");
} else
printf("插入元素失败");
}
void DoupList(LinkList *head) {
LinkList *p;
p = head->next;
while (p != NULL) {
p->data = 2 * p->data;
p = p->next;
}
printf("\n");
}
void Menu() {
printf("\n==========================");
printf("\n\t【1】求表长 ");
printf("\n\t【2】向指定位置插入元素 ");
printf("\n\t【3】删除指定位置的元素 ");
printf("\n\t【4】打印当前链表 ");
printf("\n\t【0】退出 ");
printf("\n==========================\n");
printf("请输入菜单号(0-4):");
}
int main() {
LinkList *head;
DataType x = 0;
int n, position = 0, ch2, leng;
head = InitList();
printf("请输入要建立线性表的长度:\n");
scanf("%d", &n);
CreatListH(head, n);
printf("当前链表内容为:");
DispList(head);
while (1) {
Menu();
scanf("%d", &ch2);
switch (ch2) {
case 1:
printf("当前线性表为长度为:%d \n", LengthList(head));
break;
case 2:
printf("请输入您想要插入的位置\n");
leng = LengthList(head);
while (1) {
printf("请输入 [1 - %d]\n", leng);
scanf("%d", &position);
if (leng + 1 >= position && position > 0)
break;
printf("输入的位置越界!请重新输入位置~~\n");
}
printf("请输入您想要插入的元素\n");
scanf("%d", &x);
InsList(head, position, x);
printf("插入成功!");
printf("当前链表内容为:");
DispList(head);
break;
case 3: //删除指定位置的元素
printf("请输入您想删除的位置\n");
leng = LengthList(head);
while (1) {
printf("请输入 [1 - %d]\n", leng);
scanf("%d", &position);
if (leng + 1 >= position && position > 0)
break;
printf("输入的位置越界!请重新输入位置~~\n");
}
DelList(head, position);
printf("当前链表内容为:");
DispList(head);
break;
case 4://打印当前链表
printf("当前链表内容为:");
DispList(head);
break;
case 0://结束程序
printf("正在退出......");
return 0;
default:
printf("输入的选项有误,请重新输入~~\n");
}
}
}