实验目的与要求:
- 掌握单链表的基本操作:建立、插入、删除、查找等运算。
要求:利用线性表的特性以及其链式存储结构特点对线性表进行相关操作
实验内容提要:
1.头文件说明
#include <malloc.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
2.创建链表
typedef struct node {
int data;
struct node *next;
} NODE;
/*******************函数用于创建一个链表,用户输入数据,当
输入-1的时候结束,每输入一个数据,就创建一个节点,并将节点
插入链表头部***********************/
NODE *Create() {
NODE *p, *head;
int x;
head = (NODE *)malloc(sizeof(NODE));
head->next = NULL;
printf("Input data,-1 to End!\n");
scanf("%d",&x);
while(x != -1) {
p = (NODE *)malloc(sizeof(NODE));
p->data = x;
p->next = head->next;
head->next = p;
scanf("%d",&x);
}
return(head);
}
3.输出链表元素
/***函数用于输出链表中的所有元素***/
void Output(NODE *head) {
NODE *p;
p = head;
printf("Begin to dump the LinkList...\n");
while(p->next != NULL) {
printf("->%d",p->next->data);
p = p->next;
}
printf("\nThe LinkList ended!\n");
}
4.获取链表长度
/****函数用于获取链表的长度*****/
int Listlen(NODE *head) {
int i = 0;
NODE *p = head;
while(p->next != NULL) {
i++;
p = p->next;
}
return(i);
}
5.获取链表中指定位置的元素
/***函数用于获取链表中指定位置的元素***/
int Get(NODE *head,int i) {
int j = 0;
NODE *p = head;
while(p->next && j<i) {
j++;
p = p->next;
}
if(!p->next || j>i) return(0);
else return(p->data);
}
6.删除链表中指定位置的元素
/***函数用于删除链表中指定位置的元素***/
void Del(NODE *head,int i) {
NODE *p = head;
int j = 0;
while(p->next && j<i-1) {
j++;
p = p->next;
}
if(!p->next || j>i-1) printf("the position is wrong\n");
else
p->next = p->next->next;
}
7.在链表指定位置插入一个元素
/***函数用于在链表中指定位置插入一个元素***/
void Ins(NODE *head,int i,int e) {
NODE *p = head,*q;
int j = 0;
while(p->next && j<i-1) {
j++;
p = p->next;
}
if(!p->next && j>i-1) printf("Wrong position\n" );
else {
q = (NODE *)malloc(sizeof(NODE));
q->data = e;
q->next = p->next;
p->next = q;
}
}
8.Main函数
/***函数中首先创建一个链表,然后输出链表内容,并获取链表长度,接着用户
可以输入要获取的元素位置,进行删除操作,再次输出链表内容,最后用户可以
输入要插入的位置和元素,进行插入操作,最终输出链表内容***/
void main() {
NODE *head;
int length;
int i, element;
system("cls");
head = Create();
Output(head);
length = Listlen(head);
printf("the length of the link is %d\n",length);
printf("input the order :\n");
scanf("%d",&i);
element = Get(head, i);
printf("the element of the order is %d\n",element);
printf("input the del position \n");
scanf("%d", &i);
Del(head, i);
Output(head);
printf("Input the insert posion and element:\n");
scanf("%d%d", &i, &element);
Ins(head, i, element);
Output(head);
}
9.注意:在 Del() 和 Ins() 函数中,对于指定位置的判断可能存在一些问题,比如当要删除或插入的位置超出链表长度时,会提示"the position is wrong"或"Wrong position",但实际上程序会继续执行。