C++学习---单链表的构建及操作

#include <iostream>
using namespace std;

typedef struct LinkNode
{
    int elem;//节点中的数据
    struct  LinkNode *next;//节点中的后继指针
}LinkNode,*LinkList;//LinkList为结构体LinkNode的指针

//构造空的单链表L
void InitList(LinkList &L) {
    L = new LinkNode;//生成头节点
    L->next = NULL;//头节点的后继指针初始化为NULL
}

//单链表的输入(后插法)
void ListInput(LinkList &L) {
    int n = 0;//输入数据的个数
	LinkNode *r = L;//尾指针r指向头节点
    cout << "你想要输入几个数据?" << endl;
    cin >> n;
    for (int i = 0; i < n; i++) {
        LinkNode *node = new LinkNode;
        cout << "请输入第" << i + 1 << "个数据:";
        cin >> node->elem;
        node->next = NULL; r->next = node;//将新节点*p插入尾节点*r
		r = node;//r指向新的尾节点*p
    }
}
//单链表的输出
void ListOutput(LinkList &L) {
    cout << "顺序表的值依次为:";
    LinkNode* p;
    p = L->next;
    while (p!=NULL)
    {
        cout << p->elem<<"	";
        p = p->next;
    }
}

//单链表的取值 i为取第几位值
int GetElem(LinkList &L, int i) {
    LinkList p = L->next;//p指向首元节点
    int countNum = 1;//计数器
    while (p!=NULL&&countNum<i)
    {
        p = p->next;
        countNum++;
    }
    if (p == NULL || countNum > i)//如果p为空或者计数大于i了则返回空
        return NULL;
    else
        return p->elem;
}
//单链表的查找 e为查找的值  返回元素的内存地址
LinkNode* LocateElem(LinkList &L, int e) {
    LinkNode *p = L->next;
    while (p&&p->elem!=e)
    {
        p = p->next;
    }
    return p;
}
//单链表的插入 i为插入的位置 e为插入的值
bool ListInsert(LinkList& L, int i, int e) {
    LinkList p = L;
    int j = 0;
    while (p!=NULL&&j<i-1)//将第i位的后继指针赋值给p
    {
        p = p->next; j++;
    } 
    if (p == NULL||j>i-1) return false;
    LinkNode *s = new LinkNode;//生成新节点
    s->elem = e;//将e复制给节点s
    s->next = p->next;//先将p的后继指针赋值给新节点
    p->next = s;//再把p的后继指针改为新节点
    return true;
}
//单链表的删除 i为删除的位置
bool ListDelete(LinkList& L, int i) {
    LinkList p = L;
    int j = 0;
    while (p!=NULL&&j<i-1)
    {
        p = p->next; j++;
    }
    if (p == NULL || j > i - 1) return false;
    LinkNode* s = new LinkNode;
    s = p->next;//将第i-1位元素的内存地址赋值给s
    p->next = s->next;//改变第i位元素的后继指针
    delete s;//释放第i位元素的内存空间
    return true;
}

int main()
{
    LinkList LA;
	int opearateNum = 0;//操作值
	//初始化
	InitList(LA);

	while (true)
	{
		int selectIndex = 0;//增删查所用的索引
		int selectValue = 0;//增查所用的值


		cout << "1、输入顺序表	2、输出顺序表	3、取值	4、查值	5、插入	6、删除	7、退出" << endl;
		cin >> opearateNum;
		if (opearateNum == 7)
			break;
		switch (opearateNum)
		{
		case 1:
			//数据输入
			ListInput(LA);
			system("pause");
			system("cls");
			break;
		case 2:
			//输出顺序表
			ListOutput(LA);
			system("pause");
			system("cls");
			break;
		case 3:

			cout << "输入要取第几位:";
			cin >> selectIndex;
			if (GetElem(LA, selectIndex) == 0)
				cout << "没有第" << selectIndex << "位的值" << endl;
			else
				cout << "第" << selectIndex << "位的值:" << GetElem(LA, selectIndex) << endl;
			system("pause");
			system("cls");
			break;
		case 4:
			cout << "输入要查找的值:";
			cin >> selectValue;
			if (LocateElem(LA, selectValue) == 0)
				cout << "没有该值!" << endl;
			else
				cout << "值为" << selectValue << "的内存地址:" << LocateElem(LA, selectValue) << endl;
			system("pause");
			system("cls");
			break;
		case 5:
			cout << "输入要插入的位置和值(如:第2位插入值为4,输入:2 4):";
			cin >> selectIndex >> selectValue;
			if (ListInsert(LA, selectIndex, selectValue))
				cout << "插入成功!" << endl;
			else
				cout << "插入失败!" << endl;

			system("pause");
			system("cls");
			break;
		case 6:
			cout << "输入要删除第几位:";
			cin >> selectIndex;
			if (ListDelete(LA, selectIndex))
				cout << "删除成功!" << endl;
			else
				cout << "删除失败!" << endl;
			system("pause");
			system("cls");
			break;
		case 7:
			break;
		default:
			cout << "无效操作,请重新输入!" << endl;
			break;
		}

	}
}

  

原文地址:https://www.cnblogs.com/edllixiaoyu/p/13658427.html