要求:
1. 定义单链表的存储结构;
2. 单链表的基本操作
(1)初始化单链表(无参和有参);
(2)求单链表长度;
(3)按位置查找;
(4)按值查找;
(5)在位置i插入一个数据元素;
(6)删除位置i的数据元素;
(7)遍历单链表;
(8)合并链表
(9)销毁单链表
代码:
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:4996)
#include<stdio.h>
#include<stdlib.h>
typedef struct Lnode {
int data;//数据域
struct Lnode* next;//指针域
}Lnode, * LinkList;
//链表的初始化
void initiList(LinkList L) {
L = (LinkList)malloc(sizeof(LinkList));
L->next = NULL;
return;
}
void destroyList(LinkList L) {
LinkList p;
while (L) {
p = L;
L = L->next;
free(p);
}
}
void emptyList(LinkList L) {
LinkList p, q;
p = L->next;
while (p) {
q = p->next;
free(p);
p = q;
}
L->next = NULL;
}
//求表长
int getLength(LinkList L) {
LinkList p = L->next;
int count = 0;
while (p) {
count++;
p = p->next;
}
return count;
}
//按位置查找
int getIloc(LinkList L, int i) {
LinkList p = L;
int k = 0;
while (k < i && p) {
k++;
p = p->next;
}
if (!p || i < k)
return 0;
else
return p->data;
}
//按元素查找
int getElem(LinkList L, int e) {
int count = 0;
LinkList p = L;
while (p->data != e && p) {
p = p->next;
count++;
}
if (!p)
return 0;
else
return count;
}
//按位置插入
int inPut(LinkList L, int i, int e) {
int k = 0;//k表示到第几个位置
LinkList q, p = L;
while (k < i - 1 && p) {
k++;
p = p->next;
}
if (!p || k > i - 1) {
printf("\n插入失败!");
return 0;
}
else {
q = (LinkList)malloc(sizeof(Lnode));
q->data = e;
q->next = p->next;
p->next = q;
printf("\n插入成功!");
return 1;
}
}
//按值查找
void deIloc(LinkList L, int i, int* e) {
int cnt = 0;
LinkList p = L;
while (p && cnt < i - 1) {
p = p->next;
cnt++;
}
if (!p || cnt > i - 1) {
printf("\n删除失败!");
}
else {
LinkList q = p->next;
p->next = q->next;
*e = q->data;
free(q);
printf("\n删除成功!");
}
}
void createListH(LinkList L, int n) {
int i;
LinkList s;
for (i = 0; i < n; i++) {
s = (LinkList)malloc(sizeof(Lnode));
scanf("%d", &s->data);
s->next = L->next;
L->next = s;
}
}
void createListR(LinkList L, int n) {
LinkList s, r;
r = L;
int i;
printf("\n请输入%d个整数", n);
for (i = 0; i < n; i++) {
s = (LinkList)malloc(sizeof(Lnode));
scanf("%5d", &s->data);
s->next = NULL;
r->next = s;
r = s;
}
printf("\n建立单链表成功!");
}
//显示当前链表
void listPrint(LinkList L) {
LinkList p;
p = L->next;
printf("\n");
while (p) {
printf("%5d", p->data);
p = p->next;
}
}
LinkList ConnectLinkList(LinkList& L, LinkList& L2) {
Lnode* head = new Lnode;
Lnode* p1 = L->next; //扫描指针p1指向第一个链表
Lnode* p2 = L2->next; //扫描指针p2指向第二个链表
Lnode* pre = head; //记录前驱结点
while (p1 != NULL && p2 != NULL) {
if (p1->data <= p2->data) { //按降序进行连接
pre->next = p1;
p1 = p1->next;
}
else {
pre->next = p2;
p2 = p2->next;
}
pre = pre->next;
}
pre->next = p1 == NULL ? p2 : p1;
return head;
}
void MenuLine()
{ /*显示菜单子函数*/
printf("\n =================================================");
printf("\n| 1——建立 |");
printf("\n| 2——插入 |");
printf("\n| 3——删除 |");
printf("\n| 4——按位置查找 |");
printf("\n| 5——按元素值查找 |");
printf("\n| 6——求表长 |");
printf("\n| 7——显示当前链表 |");
printf("\n| 8——合并两个链表 |");
printf("\n| 9——合并链表的显示结果 |");
printf("\n| 0——返回 |");
printf("\n =================================================");
printf("\n请输入菜单号(0-9):");
}
int main() {
LinkList L;
L = (LinkList)malloc(sizeof(Lnode));
initiList(L);
LinkList L2;
L2 = (LinkList)malloc(sizeof(Lnode));
initiList(L2);
int c, length, i, e;
int t;
printf("===============单链表初始化成功==================!\n");
char a, ch1 = 'a';
while (ch1 == 'a') {
MenuLine();
scanf("%d", &c);
switch (c) {
case 1:
printf("\n请输入所需链表长度:");
scanf("%d", &length);
createListR(L, length);
listPrint(L);
break;
case 2:
printf("\n请输入您要插入的位置");
scanf("%d", &i);
printf("\n请输入您要插入的值");
scanf("%d", &e);
//i是位置,e是值
inPut(L, i, e);
listPrint(L);
break;
case 3:
printf("\n请输入您要删除的位置");
scanf("%d", &i);
deIloc(L, i, &t);
listPrint(L);
break;
case 4:
printf("\n请输入您需要的位置:");
scanf("%d", &i);
getIloc(L, i);
printf("\n第%d位上的值为%d", i, getIloc(L, i));
break;
case 5:
printf("\n请输入您要查找的元素值");
scanf("%d", &e);
printf("\n您所查找的元素值%d在第%d位", e, getElem(L, e));
break;
case 6:
printf("\n表长为%d", getLength(L));
break;
case 7:
listPrint(L);
listPrint(L2);
ConnectLinkList(L, L2);
break;
case 8:
printf("\n请输入所需链表长度:");
scanf("%d", &length);
createListR(L, length);
listPrint(L);
printf("\n请输入第二个所需链表长度:");
scanf("%d", &length);
createListR(L2, length);
listPrint(L2);
break;
case 9:
LinkList L3;
L3=ConnectLinkList(L, L2);
listPrint(L3);
break;
case 0:
ch1 = 'g';
break;
default:
printf("\n输入有误,请重新输入");
break;
}
}
}