单链表的增删改查实例
- 注意:使用链表的插入与删除时要严格注意所插入或者删除元素在本链表中的边界问题,
- 同时也要注意链表的判空问题,
- 注意链表指针最后一定要指向NULL
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef struct Node {
//结构体定义结点
int data;
Node *next;
}*LinkedList;//结构体指针LinkedList
void InitLinkedList()//初始化
{
Node * L;//定义头结点
L = (Node *)malloc(sizeof(Node));
if (L == NULL)
printf("申请空间失败\n");
L->next = NULL;
}
LinkedList CreateLinkedListHead(int n)//头插法
{
int i;
int x;
Node *L;
L = (Node*)malloc(sizeof(Node));
L->next = NULL;
printf("请输入元素:\n");
for (i = 0; i < n; i++) {
Node *p = (Node*)malloc(sizeof(Node));
scanf("%d", &x);
p->data = x;
p->next = L->next;
L->next = p;
}
return L;
}
LinkedList CreateLinkedListTail(int n) //尾插法
{
int x;
Node *L;
L = (Node*)malloc(sizeof(Node));
L->next = NULL;
Node*r;
r = L;
printf("请输入元素:\n");
while (n--) {
scanf("%d", &x);
Node *p;
p = (Node*)malloc(sizeof(Node));
p->data = x;
r->next = p;
r = p;
}
r->next = NULL;
return L;
}
int GetLength(LinkedList L)//遍历链表求长度
{
LinkedList p;
int length = 0;
p = L->next;//p指向第一个结点
while (p) {
printf("链表数据:%d\n", p->data);
p = p->next;
length++;
}
printf("\n");
return length;
}
bool InsertLinkedList(LinkedList &L, int i, int e) //插入一个指定位置元素
{
LinkedList p;
p = L;//头指针赋值给p
int j=1;
if (i<1 || i>GetLength(L))
{
printf("Failed,边界有误\n");
return false;
}
while (p->next!=NULL&&j < i) {//查找第i-1个位置
p = p->next;
j++;
}
Node *s;//定义插入的结点
s = (Node*)malloc(sizeof(Node));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
void print(LinkedList L)//遍历链表
{
Node *p;
for (p = L->next; p!= NULL; p = p->next) {
printf("%d\t", p->data);
}
printf("\n");
}
bool deleteLinkedList(LinkedList &L, int i)//删除指定位置的元素
{
LinkedList p, q;
p = L;
int j = 1;
if (i<1 || i>GetLength(L))
{
printf("Failed,边界有误\n");
return false;
}
while (p->next != NULL && j < i) {
p = p->next;
j++;
}
q = p->next;//指向q自己
p->next = p->next->next;
free(q);//释放q结点
return true;
}
int GetElem(LinkedList L, int i)//获取元素
{
int e;
int j = 1;
LinkedList p;
p = L->next;
while (p&&j < i)
{
p = p->next;
j++;
}
if (!p || j > i) {
printf("第%d个节点不存在!非法查找0_", i);
return 0;
}
else
e = p->data;
return e;
}
void ClearList(LinkedList L)//释放链表
{
LinkedList p, q;
p = L->next;
while (p) {
q = p->next;
free(p);
p = q;
}
L->next = NULL;
}
int main() {
int n, i, x;
LinkedList L;
InitLinkedList();
printf("请输入链表长度(头插法):\n");
scanf("%d", &n);
L = CreateLinkedListHead(n);
print(L);
printf("请输入链表长度(尾插法):\n");
scanf("%d", &n);
L = CreateLinkedListTail(n);
print(L);
printf("链表长度%d\n",GetLength(L));
printf("输入要获取哪一位置的元素:\n");
scanf("%d", &i);
printf("%d\n", GetElem(L, i));
printf("输入要插入的元素e与位置i:");
scanf("%d %d",&x,&i);
InsertLinkedList(L, i, x);
print(L);
printf("输入要删除哪一位置上的元素:");
scanf("%d", &i);
deleteLinkedList(L, i);
print(L);
printf("\n是否要整表删除1/0?\n");
scanf("%d", &x);
if (x == 1)
{
ClearList(L);
printf("单链表为:");
print(L);
}
else
{
printf("单链表仍为:");
print(L);
}
return 0;
}