面试题4:单链表的插入与删除
2016-03-27 22:52 Keiven_LY 阅读(776) 评论(0) 编辑 收藏 举报单链表第pos位置插入结点的算法思路:
- 声明一个结点p指向链表的头结点,初始化i从1开始;
- 当i < pos时,就遍历链表,让p的指针向后移动,不断指向下一结点,i累加1;
- 若到链表末尾p为空,则说明第pos个元素不存在;
- 否则査找成功,在系统中生成一个空结点q;
- 将数据元素elem賦值给q->data;
- 单链表的插入标准语句q->next=p->next; p->next=q;
- 返回成功。
单链表的插入功能函数
/* 在链表的pos位置插入元素elem */ void InsertNode(Node *head, int pos, int elem) { Node *p = head; //声明一个结点p,指向头结点 int i = 1; while(p && i < pos) //寻找插入的位置 { p = p->next ; ++i; } if(!p || i > pos) { cout << "要插入的位置不存在" << endl; } Node *q = (Node *)malloc(sizeof(Node)); q->data = elem; q->next = p->next; p->next = q; }
单链表删除pos位置的结点的算法思路:
- 声明一个结点p指向链表第一个结点,初始化i从1开始;
- 当i<pos时,就遍历链表,让p的指针向后移动,不断指向下一个结点,i累加 1;
- 若到链表末尾p为空,则说明第pos个元素不存在;
- 否则査找成功,将欲删除的结点p->next賦给q;
- 单链表的删除标准语句p->next=q->next;
- 释放q结点;
- 返回成功。
单链表的删除功能函数
/* 删除链表pos位置的元素 */ void DeleteNode(Node *head, int pos) { Node *p = head; //声明一个结点p,指向头结点 int i = 1; while(p->next && i < pos) //寻找插入的位置 { p = p->next; ++i; } if(!(p->next) || i > pos) { cout << "要删除的位置不存在" << endl; } Node *q = p->next; p->next = q->next; free(q); // 让系统回收此结点,释放内存 }
完整的可执行程序:
#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; } /* 在链表的pos位置插入元素elem */ void InsertNode(Node *head, int pos, int elem) { Node *p = head; //声明一个结点p,指向头结点 int i = 1; while(p && i < pos) //寻找插入的位置 { p = p->next ; ++i; } if(!p || i > pos) { cout << "要插入的位置不存在" << endl; } Node *q = (Node *)malloc(sizeof(Node)); q->data = elem; q->next = p->next; p->next = q; } /* 删除链表pos位置的元素 */ void DeleteNode(Node *head, int pos) { Node *p = head; //声明一个结点p,指向头结点 int i = 1; while(p->next && i < pos) //寻找插入的位置 { p = p->next; ++i; } if(!(p->next) || i > pos) { cout << "要删除的位置不存在" << endl; } Node *q = p->next; p->next = q->next; free(q); // 让系统回收此结点,释放内存 } /****打印单链表******/ 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; } } 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 position_insert, position_delete; int data; cout << "请输入要插入的元素及其插入位置: " <<endl; cin >> data >> position_insert; InsertNode(SingleLinkList, position_insert, data); cout << "插入新元素后的链表如下: " <<endl; print(SingleLinkList); cout << endl; cout << "请输入要删除元素的位置: " <<endl; cin >> position_delete; DeleteNode(SingleLinkList, position_delete); cout << "删除" << position_delete <<"位置的元素后,链表如下: " <<endl; print(SingleLinkList); cout << endl; system("pause"); return 0; }
运行结果: