c++链表添加删除修改


#include "stdafx.h"
#include<iostream>
#include "assert.h"
#include "windows.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	return 0;
}

#define COUNT 3

//定义一个节点结构体
struct NODE
{
    unsigned long uID;
    char strName[16];  //用指针的话会出访问冲突异常
    NODE *next;
};

//创建一个具有n个节点的链表,从键盘输入数据将其初始化,并返回链表的首节点指针
NODE *createNode(int n)
{
    NODE *pHead, //首节点指针 
         *pRear, //尾节点指针
         *pNew; //新节点指针
    int i;
    char *strName = new char[16];
    for (i=0; i<n; i++)
    {
        pNew = new NODE;
        do 
        {
            printf("请输入ID和名称: \n");
            scanf("%d %s",&pNew->uID, strName);    
            if (strlen(strName) > 16)
            {
                printf("输入名称长度超出范围,请重新输入: \n");
                Sleep(1000);
            }
        } while(strlen(strName) > 16);
        strcpy(pNew->strName, strName);

        if (0==i)
        {
            pRear = pHead = pNew;
        } 
        else
        {
            pRear->next = pNew;
        }
        pNew->next = NULL;
        pRear = pNew;
    }
    delete []strName;
    return pHead;
}

//打印链表中所有节点的数据
void printNode(NODE *pHead)
{
    NODE *pTemp = pHead;
    assert(pTemp != NULL);
    while (pTemp != NULL)
    {
        printf("%d %s ",pTemp->uID, pTemp->strName);
        pTemp = pTemp->next;
    }
	printf("\n");
}

//查询链表中具有指定ID的节点,并返回此节点指针
NODE *searchNode(NODE *pHead, unsigned long uID)
{
    NODE *pDest = pHead;
    assert(pDest != NULL);
    while (pDest->next!=NULL && pDest->uID!=uID)
    {
        pDest = pDest->next;
    }
    if (pDest->uID == uID)
    {
        return pDest;
    } 
    else
    {
        printf("搜索失败,未找到找定ID的节点! \n");
        return NULL;
    }
}

//删除指定ID的节点
NODE *deleteNode(NODE *pHead, unsigned long uID)
{
    NODE *pDest, //要删除的节点
         *pBefore; //前一个节点
    pDest = pHead;
    assert(pDest != NULL);
    while (pDest->next!=NULL && pDest->uID!=uID)
    {
        pBefore = pDest;
        pDest = pDest->next;
    }
    if (pDest->uID == uID)
    {
        if (pDest == pHead)
        {
            pHead = pDest->next;
        } 
        else
        {
            pBefore->next = pDest->next;
        }
        free(pDest);
        printf("节点已被删除! \n");
    } 
    else
    {
        printf("未找到指定节点,无法将其删除! \n");
    }
    return pHead;
}

//在指定ID的节点后插入一个新的节点
NODE *insertNode(NODE *pHead, unsigned long uID)
{
    NODE *pDest, *pNew;
    pDest = pHead;
    assert(pDest != NULL);
    while(pDest->next!=NULL && pDest->uID!=uID)
    {
        pDest = pDest->next;
    }
    if(pDest->uID == uID)
    {
        pNew = new NODE;
        printf("请输入新节点的ID和名称: \n");
        scanf("%d %s",&pNew->uID,pNew->strName);
        pNew->next = pDest->next;
        pDest->next = pNew;
        printf("节点插入完成! \n");
    }
    else
    {
        printf("未找到指定节点! \n");
    }
    return pHead;
}

void main()
{
    NODE *pHead, *pDest;
    int nSelect;
    bool isExit = false;
    unsigned long uID;
    printf("请根据提示输入数据初始化链表: \n");
    pHead = createNode(COUNT);
    assert(pHead != NULL);
    printf("链表创建成功!存储数据如下: \n");
    printNode(pHead);
    while (!isExit)
    {
        printf("-------------------------- \n");
        printf("请选择要进行的操作: \n");
        printf("1.打印出链表所有节点数据: \n");
        printf("2.输入ID查询名称。 \n");
        printf("3.删除指定ID的节点。 \n");
        printf("4.在指定ID的节点后插入一个新的节点。\n");
        printf("5.退出。\n");
        printf("--------------------------- \n");
        scanf("%d",&nSelect);
        switch(nSelect)
        {
        case 1:
            printf("链表所有节点数据如下: \n");
            printNode(pHead);
            break;
        case 2:
            printf("请输入要查询的节点的ID:\n ");
            scanf("%d",&uID);
            pDest = searchNode(pHead, uID);
            if (pDest != NULL)
            {
                printf("已找到节点,名字为:%s ",pDest->strName);
				printf("\n");
            }
            break;
        case 3:
            printf("请输入要删除的节点的ID:\n ");
            scanf("%d",&uID);
            pHead = deleteNode(pHead, uID);
            break;
        case 4:
            printf("请输入要插入的节点的ID: \n");
            scanf("%d",&uID);
            pHead = insertNode(pHead, uID);
            break;
        case 5:
            isExit = true;
            printf("程序已退出! \n");
            break;
        default:
            printf("按键错误,请重新选择! \n");
            break;
        }
    }
}


  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
链表是一种常见的数据结构,C++也提供了相关的链表类。下面是一个简单的单向链表的实现示例: ```c++ #include <iostream> using namespace std; // 链表节点 struct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(NULL) {} }; // 链表类 class LinkedList { public: LinkedList() { head = NULL; size = 0; } // 在链表尾部添加一个节点 void add(int val) { ListNode* node = new ListNode(val); if (head == NULL) { head = node; } else { ListNode* cur = head; while (cur->next != NULL) { cur = cur->next; } cur->next = node; } size++; } // 删除指定值的节点 void remove(int val) { if (head == NULL) { return; } if (head->val == val) { ListNode* temp = head; head = head->next; delete temp; size--; return; } ListNode* cur = head; while (cur->next != NULL) { if (cur->next->val == val) { ListNode* temp = cur->next; cur->next = cur->next->next; delete temp; size--; return; } cur = cur->next; } } // 打印整个链表 void print() { ListNode* cur = head; while (cur != NULL) { cout << cur->val << " "; cur = cur->next; } cout << endl; } // 获取链表的长度 int getSize() { return size; } private: ListNode* head; int size; }; int main() { LinkedList list; list.add(1); list.add(2); list.add(3); list.add(4); list.print(); // 输出:1 2 3 4 list.remove(3); list.print(); // 输出:1 2 4 cout << "链表长度:" << list.getSize() << endl; // 输出:链表长度:3 return 0; } ``` 这个链表类实现了在链表尾部添加一个节点删除指定值的节点、打印整个链表、获取链表的长度等方法。你可以根据自己的需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值