面试题3:单链表重置为空表
2016-03-25 21:32 Keiven_LY 阅读(1539) 评论(0) 编辑 收藏 举报题目描述:
当我们不需要使用单链表时,就需要将其销毁,也就是在内存中将其释放掉。
单链表销毁的基本思路:
1、声明两个结点:p和q;
2、将链表的第一个结点赋给结点p;
3、循环:
- 将下一结点赋值给q;
- 释放p;
- 将q赋值给p。
单链表销毁的功能函数:
int ClearLinkList(Node *head) { Node *p, *q; p=head->next; /* p指向第一个结点 */ if(nullptr == p) { cout << "This is just a empty LinkList" <<endl; return 0; } while(p) { q=p->next; free(p); p=q; } head->next=NULL; /* 头结点指针域为空 */ return 1; }
完整的可执行程序:
#include<iostream> #include<stdlib.h> #include<time.h> using namespace std; typedef struct node { int data; struct node *next; }Node; Node *CreateListHead(int n) //创建含有n个结点的单链表 { Node *head; head=(Node *)malloc(sizeof(Node)); /*创建头结点*/ Node *q = head; /* 初始化随机数种子 */ srand(time(0)); //srand函数在stdlib.h头文件中,time函数在time.h头文件中 for(int i=0; i < n; i++) { Node *p = (Node *)malloc(sizeof(Node)); p->data = rand()%100+1; //随机生成100以内的数字 p->next = q->next; q->next = p; q = p; } q->next = NULL; return head; } /****打印单链表******/ void print(Node *head) { Node *p; if(head->next==NULL) { cout << "The LinkList is Empty !" <<endl; return; } p=head->next; while(p!=NULL) { cout << p->data << " " ; p=p->next; } } /* 链表本身为空,返回0; 链表不为空,销毁后返回1 */ int ClearLinkList(Node *head) { Node *p, *q; p=head->next; /* p指向第一个结点 */ if(nullptr == p) { cout << "This is just a empty LinkList" <<endl; return 0; } while(p) { q=p->next; free(p); p=q; } head->next=NULL; /* 头结点指针域为空 */ return 1; } int main() { Node *SingleLinkList = NULL; int length; cout << "Please input the length of LinkList: " <<endl; cin >> length; SingleLinkList = CreateListHead(length); cout << "The new created LinkList as below: " <<endl; print(SingleLinkList); cout << endl; int m = ClearLinkList(SingleLinkList); if(m == 1) { cout << "The LinkList has been set empty !" << endl; } print(SingleLinkList); cout << endl; system("pause"); return 0; }
运行结果: