您的位置:首页 > 编程语言 > C语言/C++

面试题一 C/C++面试秘笈之单链表的创建,增删改查及打印

2016-02-23 16:00 423 查看
/**面试题1
*编程实现一个单链表
*/
typedef struct node{
int data;//节点内容
node * next;//下一个节点
}node;

//创建一个单链表
node *create(){
int i =0;//链表中数据的个数
node *head,*p,*q;
head = (node*)malloc(sizeof(node));//创建头节点
int x =0;

while (1) {
cout<<"请输入一个数据:"<<endl;
cin>>x;
if (x ==0) {//data为0时创建结束
break;
}
p = (node*)malloc(sizeof(node));
p->data = x;
if (++i ==1) {//链表中只有一个元素
head->next = p;//连接到head的后面
}else{
q->next = p;//连接到链表尾端
}
q=p;//q指向末尾节点
}
q->next =NULL;//链表的最后一个节点为NULL

return head;
}

/**面试题2
*编程实现一个单链表测长
*返回单链表长度
*/
int listLength(node *head)
{
int len =0;
node * p;
p = head->next;
while (p !=NULL) {
len++;
p = p -> next;
}
return len;
}

/**面试题3
*编程实现一个单链表的打印
*/
void linkPrint(node *head)
{
int index =0;//总得个数
node *p;
if (head->next ==NULL) {//链表为空
cout<<"Link is empty!"<<endl;
return;
}
p = head->next;
while (p !=NULL) {//遍历链表
printf("the %dth is node:%d\n",++index,p->data);//打印链表元素
p = p->next;
}
}

/*面试题4
*编程实现一个单链表节点的查找,查找链表Pos位置的节点,返回节点指针
*pos从0开始,0返回头节点
*/
node *search_node(node * head,int pos)
{
node * p = head->next;
if (pos <0) {//pos位置不正确
returnNULL;
}
if (pos ==0) {//等于0,返回头节点
return head;
}
if (p ==NULL) {//链表为空
printf("Link is empty");
returnNULL;
}
while (--pos) {
if ((p = p->next) ==NULL) {//超出链表返回
printf("incorrect position to search node!\n");
break;
}
}
return p;
}

/**面试题5
*编程实现一个单链表节点的插入
*向链表中某个位置(第pos节点)之后插入节点,这里分为插入到链表首部,插入到链表的中间以及链表的尾端
*在链表pos出插入节点,返回链表头指针
*pos从0开始计算,0表示插入到head节点的后面
*/
node *insert_node(node *head,int pos,int data)
{

node *item =NULL;
node *p;
item = (node*)malloc(sizeof(node));
item->data = data;
if (pos ==0) {//插入到头节点的后面
head->next = item;
return head;//返回头节点
}
p = search_node(head,pos);//获得位置Pos的指针节点
if (p!=NULL) {
item->next = p->next;//item指向原节点的后一个节点
p->next = item;//把item插入到Pos的后面
}

return head;

}

/**面试题6
*编程实现一个单链表节点的删除
*删除单链表pos位置的节点,返回链表头指针
*pos从1开始计算,1表示删除head的后一个节点
*/
node *delete_node(node *head,int pos)
{
node * item =NULL;
node * p = head->next;
if (p ==NULL) {//链表为空
cout<<"Link is empty!"<<endl;
return head;
}

p = search_node(head, pos-1);//获得Pos指针的位置
if(p !=NULL && p->next !=NULL)
{
item = p->next;
p->next = item->next;
delete item;
}
return head;

}
int main(int argc,const
char * argv[]) {

node *head =create();//创建单链表

cout<<"Length:"<<listLength(head)<<endl;//测试单链表的长度
//在第2个节点之后插入5
head = insert_node(head,2,
5);
//打印链表
cout<<"insert integer 5 after 2th node : "<<endl;
linkPrint(head);
//链表删除
head = delete_node(head,5);
cout<<"delete the 3th node:"<<endl;
linkPrint(head);

return0;
}

如果有任何问题,欢迎下方留言谈论,或者加入QQ群83459374交流
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: