1.单链表

#include<stdio.h>
#include<stdlib.h>

typedef struct LNode
{
    int data;
    struct LNode *next;
}LNode,*LinkList;

LinkList List_HeadInsert(LinkList &L);//头插法建立单链表
LinkList List_TailInsert(LinkList &L);//尾插法建立单链表
LNode *GetElem(LinkList L,int n);//按序号查找结点值
LNode *LocateElem(LinkList L,int e);//按值查找结点并返回(这里是返回结点)
int LocateElem1(LinkList L,int e);//按值查找结点并返回(这里是返回结点位置)
bool InsertElem(LinkList &L,int n,int e);//插入结点(按位置)
bool DeleteElem1(LinkList &L,int n);//删除结点(按位置)
bool DeleteElem2(LinkList &L,int e);//删除结点(按元素值)
int GetLength(LinkList L);//求表长
void OutputList(LinkList L);//正序输出单链表
int OutputLNode(LNode *p);//输出结点值
LinkList MergeLinkList_Dcrease(LinkList A,LinkList B,LinkList &C);
LinkList MergeLinkList_Increase(LinkList A,LinkList B,LinkList &C);

int main()
{
    int e=3;
    LinkList A,B,C,D;
    printf("请输入单链表A元素(输入9999结束接受):");
    //List_HeadInsert(L);
    List_TailInsert(A);
    printf("请输入单链表B元素(输入9999结束接受):");
    List_TailInsert(B);
    OutputList(A);
    OutputList(B);
    //OutputList(MergeLinkList_Dcrease(A,B,C));
    OutputList(MergeLinkList_Increase(A,B,D));
    OutputList(A);
    //OutputList(B);

    /*
        两个合并的操作没办法都运行,因为在函数中B的头结点被释放了。
        而运行一个合并操作后,下一个合并操作B就找不到了。
    */
    /*
    printf("%d ",GetLength(L));
    printf("%d ",LocateElem1(L,e));
    printf("%d ",OutputLNode(GetElem(L,2)));
    printf("%d ",
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是单链表的基本操作及应用的实现思路: 1. 创建单链表 创建单链表需要定义一个链表节点结构体,包含数据域和指针域。然后通过循环创建节点并将它们链接起来,最后返回链表的头指针。 ``` struct Node { int data; // 数据域 Node* next; // 指针域 }; Node* createList() { Node* head = new Node; // 头节点不存储数据 head->next = nullptr; Node* tail = head; // 尾指针,初始指向头节点 int n; // 节点个数 cin >> n; for (int i = 0; i < n; i++) { Node* node = new Node; cin >> node->data; node->next = nullptr; tail->next = node; tail = node; } return head; } ``` 2. 插入节点 插入节点分为头插法和尾插法。头插法将新节点插入到链表头部,尾插法将新节点插入到链表尾部。 ``` // 头插法 void insertHead(Node* head, int value) { Node* node = new Node; node->data = value; node->next = head->next; head->next = node; } // 尾插法 void insertTail(Node* head, int value) { Node* tail = head; while (tail->next != nullptr) { tail = tail->next; } Node* node = new Node; node->data = value; node->next = nullptr; tail->next = node; } ``` 3. 删除节点 删除节点需要先找到待删除节点的前一个节点,然后将前一个节点的指针域指向待删除节点的后一个节点,最后释放待删除节点的内存空间。 ``` void deleteNode(Node* head, int value) { Node* p = head; while (p->next != nullptr && p->next->data != value) { p = p->next; } if (p->next != nullptr) { Node* temp = p->next; p->next = temp->next; delete temp; } } ``` 4. 查找节点 查找节点需要遍历链表,直到找到目标节点或到达链表尾部。 ``` Node* searchNode(Node* head, int value) { Node* p = head->next; while (p != nullptr && p->data != value) { p = p->next; } return p; } ``` 5. 显示链表 显示链表需要遍历链表,依次输出每个节点的数据。 ``` void displayList(Node* head) { Node* p = head->next; while (p != nullptr) { cout << p->data << " "; p = p->next; } cout << endl; } ``` 6. 通讯录设计(应用) 通讯录可以使用单链表来实现,每个节点存储一个人的姓名和电话号码。具体实现过程如下: ``` // 通讯录节点结构体 struct Person { string name; // 姓名 string phone; // 电话号码 Person* next; // 指针域 }; // 创建通讯录 Person* createAddressBook() { Person* head = new Person; head->next = nullptr; Person* tail = head; int n; cin >> n; for (int i = 0; i < n; i++) { Person* person = new Person; cin >> person->name >> person->phone; person->next = nullptr; tail->next = person; tail = person; } return head; } // 插入联系人 void insertPerson(Person* head, string name, string phone) { Person* person = new Person; person->name = name; person->phone = phone; person->next = head->next; head->next = person; } // 删除联系人 void deletePerson(Person* head, string name) { Person* p = head; while (p->next != nullptr && p->next->name != name) { p = p->next; } if (p->next != nullptr) { Person* temp = p->next; p->next = temp->next; delete temp; } } // 查找联系人 Person* searchPerson(Person* head, string name) { Person* p = head->next; while (p != nullptr && p->name != name) { p = p->next; } return p; } // 显示通讯录 void displayAddressBook(Person* head) { Person* p = head->next; while (p != nullptr) { cout << p->name << "\t" << p->phone << endl; p = p->next; } } ``` 以上是单链表的基本操作及通讯录应用的实现思路,具体实现过程中还需要考虑一些细节问题,例如输入格式检查、异常处理等。希望能够对您有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值