#define _CRT_SECURE_NO_WARNINGS
#define ERROR 0
#define OK 1
#include <iostream>
using namespace std;
typedef int Status;
typedef int Elemtype;
typedef struct Lnode//定义链表
{
Elemtype data;
struct Lnode *next;
}Lnode,*Linklist;
Status Init(Linklist&L)//初始化
{
L = new Lnode;//用new为L动态分配空间,空间中有data,*next
L->next = NULL;
cout << "\t\t初始化成功!" << endl;
return OK;
}
Status Createlist(Linklist&L)//初始创建链表
{//尾插法
int n;
Lnode *p,*r;//生成结点p和尾指针r
r = L;
cout << "输入元素个数:";
cin >> n;
cout << "请输入元素:";
for (int i = 1; i <= n; i++)
{
p = new Lnode;//为p分配空间
cin >> p->data;
p->next = NULL;
r->next=p;//r->next本来是NULL,现在把p赋给r->next
r = p;//r是尾指针,要一直指向尾部
}
cout << "初始化创建成功!" << endl;
return OK;
/* 前插法
int n;
Linklist p;//生成结点p
cout << "输入元素个数:";
cin >> n;
cout << "请输入元素:";
for (int i = 1; i <= n; i++)
{
p = new Lnode;//为p分配空间
cin >> p->data;
p->next=L->next;
L->next = p;
}*/
}
void Output(Linklist L)
{
Lnode* tmp = L->next;//!!!
while (tmp != NULL)
{
cout << tmp->data<<" ";
tmp = tmp->next;
}
cout << endl;
}
Status Insert(Linklist& L)
{//在第n个元素前插入
int n,i=1;
Lnode* tmp = L;
cout << "请输入插入的位置:";
cin >> n;
//while (tmp->next != NULL && i < n)
while (tmp && i < n)
{
tmp = tmp->next;
i++;
}//跳出循环时tmp指向n的前一个
//if (tmp->next == NULL)
if(tmp==NULL){ cout << "位置非法,插入失败!" << endl; return ERROR; }
Lnode* p;//生成新节点
p = new Lnode;//分配空间
cout << "输入要插入的数字:";
cin >> p->data;
p->next=tmp->next;
tmp->next=p;
cout << "插入成功!" << endl;
Output(L);
return OK;
}
Status Getelem(Linklist L)
{
int n,i=1;
Lnode* tmp=L;
cout << "请输入要获取的元素的位置:";
cin >> n;
//while (tmp->next != NULL && i < n)//可以循环,判断i==n时直接输出
while (tmp && i < n)
{//终止条件是tmp->next为空 或者 i==n
tmp=tmp->next;
i++;
}
if (tmp == NULL) { cout << "位置非法,插入失败!" << endl; return ERROR; }
cout << i <<"号位置的元素为" << tmp->data << endl;//此时i==n,直接输出
cout << "获取元素成功!" << endl;
return OK;
}
Status Search(Linklist L)
{
int elem,flag=0,i=1;
Lnode* tmp=L;
cout << "请输入要查询的元素:";
cin >> elem;
//while (tmp->next != NULL)
while (tmp)
{
if (tmp->data == elem){
cout << "该元素的位置为" << i << endl;
cout << "查找成功!"<<endl;
flag = 1;
return OK;}
tmp = tmp->next;
i++;
}
if (flag == 0)cout << "查询失败" << endl;
}
Status Del(Linklist& L)
{
Lnode* p = L;
cout << "请输入删除的元素的位置:";
int x;
cin >> x;
int i = 1;
while (p->next != NULL && i < x )// || ?
{
p = p->next;
i++;
}
if (p->next == NULL) { cout << "位置非法,删除失败!" << endl; return ERROR; }
Lnode* tmp;//临时存放,以备删除
tmp=p->next;
p->next=tmp->next;
delete tmp;
cout << "删除成功!" << endl;
Output(L);
return OK;
}
void menu(Linklist L)
{
printf("---------------------------------------\n");
printf("\t1.清屏\t2.创建\t3.输出\n");
printf("\t4.插入\t5.删除\t6.取值\n");
printf("\t7.查找\t0.退出\n");
printf("---------------------------------------\n");
int select;
while(1)
{
cout << "请输入选项:";
cin >> select;
switch (select)
{
case 1:system("cls"); break;
case 2:Createlist(L); break;
case 3:Output(L); break;
case 4:Insert(L); break;
case 5:Del(L); break;
case 6:Getelem(L); break;
case 7:Search(L); break;
case 0:exit(1); break;
default:cout << "请重新输入!" << endl;
}
}
}
int main()
{
Linklist L;//创建头指针
Init(L);//初始化 将头指针传入初始化函数初始化
menu(L);
return 0;
}
我输入的11 22 33,结果33被挤没了,第一个位置是-842150451,检查了output函数和init函数没问题啊,之后在第5个位置插入66后,33才出来,但是插入的66看不到
我在第一个位置插入44,结果44成了第二个元素
我要删除第一个元素-842150451,结果把第二个44删了,但是查询-842150451的位置就是1
头大,哪里有问题?请指教!!谢谢