#include<iostream>
using namespace std;
typedef struct node
{
int data;
struct node*next;
}Node, *List; //相当于把strcut node另外命名为NOde和List* 指针类型
List creatlist()
{
Node* head, *p1, *p2; //建立一个链表,存储数据,p1和p2用于存储,当前数据和后一数据
head = p2 = new Node;
int num;
cin >> num;
while (-1 != num)
{
p1 = new Node;
p1->data = num;
p1->next = NULL; //p1是新建的节点对象,存储输入的数据
p2->next = p1; //p2指向新产生的对象
p2 = p1; //p2转移到链表的尾部
cin >> num;
}
p2->next = NULL; //这一步必须的操作,,因为链表尾部指向一个空的对象
return head;
}
int getlistlength(List p)
{
int lenlistlength = 0;
while (p->next != NULL) //获取链表的长度,主要是循环从链表的头部开始进行循环,知道节点指向一个空的对象
{
p = p->next;
lenlistlength++;
}
return lenlistlength;
}
List insertnode(List p, int position, int element)
{
int length = getlistlength(p);
if (position<1 || position>length + 1)
{
cout << "wrong position" << endl;
exit(1);
}
Node *p1 = p->next; //想要插入一个数据,必须得到插入位置的地址利用循环得到地址
Node*p2 = p;
int i;
for (i = 0; i < position; i++)
{
p2 = p1;
p1 = p1->next; //得到插入位置的前一个对象和后一个对象的地址
}
Node* s = new Node; //建立一个新的对象存储输入的数据
s->data = element;
s->next = p1;
p2->next = s;
return p;
}
void printlist(List p)
{
while (p->next != NULL) //循环输出,知道链表指向的对象是空为止
{
/*p = p->next;*/
cout << p->next->data << endl; //因为第一个是链表的头,没存储数据
p=p->next;
}
}
void releaselist(List p) //利用递归的方法进行释放每一个对象,,,迭代到最后一个对象,利用栈 思想进行释放内存
{
if (NULL == p->next)
{
delete p;
}
else
{
releaselist(p->next);
delete p;
}
}
int main()
{
List head = creatlist();
printlist(head);
int position = 4;
int element = 100;
head = insertnode(head, position, element);
releaselist(head);
return 0;
}
单链表的建立,插入和释放
最新推荐文章于 2024-01-02 10:42:20 发布