注意:指针初始化时硬纸箱一个特定的值,否则在运行时会出现bug。
代码:
/*
* 2.c++
*
* Created on: 2016-4-10
* Author: Administrator
*/
# include <stdio.h>
# include <iostream>
using namespace std;
typedef struct LNode{
int data;//数据域
struct LNode *next;//指针域
}LNode,*LinkList;//LinkList为指向LNode结构体的指针类型
//定义链表
LinkList L=new LNode,p=new LNode;
void InitList_L(LinkList L){
//构造一个空的单链表
L=new LNode; //生成新的节点作为头结点,用头指针L指向头结点
L->next=NULL;
}
void GetElem_L(){
//查找第i个位置上p的数据域的值
int i;
printf("请输入你想查找值的位置\n");
scanf("%d",&i);
p=L->next;int j=1;//p指向第一个节点,j为计数器
while (p&&j<i){
p=p->next;
j++;
}
if (!p||j>i)
printf("查找失败!\n");
else
printf("第%d个位置上的元素值为%d\n",i,p->data);
}
void LocateElem_L(){
//根据元素值查找元素,输出元素所在的位置
int e;
printf("请输入你想查找元素的值\n");
scanf("%d",&e);
p=L->next;
int i=1;
while(!p&&p->data!=e){
i++;
p=p->next;
}
if(p->data==e)
printf("值为%d的元素所在的位置是%d\n",e,i);
else
printf("查找失败!\n");
}
void ListInsert_L(){
//在第i个位置之前插入元素e
int i,e;
printf("请输入你想插入元素的位置以及元素的值\n");
scanf ("%d %d",&i,&e);
int j=0;
p=L;
while(p&&j<i-1){
p=p->next;
j++;
}
if(!p||j>i-1)
printf("插入失败\n");//如果i大于表长加1,或者小于1
else
{
LNode *s=new LNode;
s->data=e;
s->next=p->next;
p->next=s;
printf("插入成功\n");
}
}
void ListDelete_L(){
//删除第i个元素
int i;
printf("请输入你想删除的结点位置\n");
scanf("%d",&i);
p=L;int j=0;
while(p->next&&j<i-1){
p=p->next;
j++;
}//执行完此操作之后p指向第i-1个结点
if ((!(p->next))||j>i-1){
printf("删除失败\n");
}
else{
LNode *q;
q=p->next; //q为第i个结点的地址
p->next=q->next;
delete q;
printf("删除成功\n");
}
}
void CreateList_F(){
//前插法创建单链表
int n;
printf("请输入你想创建的个数\n");
scanf("%d",&n);
L->next=NULL;
int i;
for (i=n;i>0;i--){
p=new LNode;
printf("请输入结点的数值\n");
scanf("%d",&p->data);
p->next=L->next;
L->next=p;
}
}
void CreateList_L(){
//后插法创建单链表
int n;
printf("请输入你想创建的个数\n");
scanf("%d",&n);
L->next=NULL;
LNode *r;
r=L;
int i=0;
for (i=0;i<n;i++){
scanf("%d",&p->data);
p->next=NULL;
r->next=p;
r=p;
}
}
void ThroughList(){
//遍历整个链表
int i=1;
p=L->next;
while(p){
printf("链表的第%d个元素值为%d\n",i,p->data);
p=p->next;
i++;
}
}
int main()
{
InitList_L(L);
int t;
while (1){
printf("1.前插法创建链表 2.后插法创建链表3.遍历整个链表4.删除第i个结点\n");
printf("5.在第i个位置前插入结点 6.根据元素值查找元素 7.根据位置查找元素\n");
scanf("%d",&t);
switch(t){
case 1:CreateList_F();break;
case 2:CreateList_L();break;
case 3:ThroughList();break;
case 4:ListDelete_L();break;
case 5:ListInsert_L();break;
case 6:LocateElem_L();break;
case 7:GetElem_L();break;
default:printf("输入有误!\n");break;
}
}
return 0;
}
//注意指针初始化问题,引起程序崩溃