#include <iostream>
#include<malloc.h>
#include<stdlib.h>
using namespace std;
#define Status int
#define OK 1
#define ERROR 0
//---------------------
typedef struct Node
{
int data;
struct Node *next;
}Node;
typedef struct Node *LinkList;//定义LinkList 其实就是给Node*取一个别名 和Node* LinkList是一样的啦
//尾查法创建单向链表
void CreateListTail(LinkList L,int n)
{
LinkList tail,p;
L->next=NULL;
tail=L;
srand(time(0));
while(n--)
{
p=(LinkList)malloc(sizeof(Node));
p->data=rand()%100+1;
tail->next=p;//添加到尾部
tail=p;
}
}
//头插法创建单向链表
void CreateListHead(LinkList L,int n)
{
LinkList p;
L->next=NULL;//初始化指针
srand(time(0));//初始化随机种子
while(n--)
{
p=(LinkList)malloc(sizeof(Node));//申请内存 不申请的话出了函数就会被释放
p->data=rand()%100+1;//产生1-100内的随机数
p->next=L->next;
L->next=p;
}
}
void ClearList(LinkList L)
{
LinkList p,q;
p=L->next;//获取头结点
q=p->next;
while(q)
{
free(p);
p=q;
q=q->next;
}
L->next=NULL;
}
Status GetElem(LinkList L,int i,int *e)
{
int j=0;
LinkList p;
p=L->next;//跳过链表头的查找
while(p&&j<i)//指针要非空
{
p=p->next;
j++;
}
if(j>i||!p)//j大于i
return ERROR;
else
*e=p->data;
return OK;
}
//插入一个元素到指定位置
Status InsertElem(LinkList L,int i,int e)
{
LinkList p,s;
int j=0;
p=L;//链表头也包括在内
while(j<i-1&&p)//先找到这个元素
{
p=p->next;
j++;
}
if(j>i-1||!p) return ERROR;
s=(LinkList)malloc(sizeof(Node));
s->next=p->next;
p->next=s;
s->data=e;
return OK;
}
//删除指定位置的元素
Status DeletElem(LinkList L,int i,int *e)
{
int j=0;
LinkList p,q;
p=L;
while(j<i-1&&p->next)
{
p=p->next;
j++;
}
if(j>i-1||!(p->next)) return ERROR;
q=p->next;
p->next=q->next;
*e=q->data;
free(q);//释放内存
return OK;
}
int main() {
// your code goes here
Node node_1,node_2,node_3,node_head,node_test;
Node *node_temp;
node_head.next=&node_1;//指针头可以没有数据 因为他只是指向第一个节点而已
node_1.data=1;
node_1.next=&node_2;
node_2.data=2;
node_2.next=&node_3;
node_3.data=3;
node_3.next=NULL;
LinkList L=&node_head;
LinkList L1=&node_test;
CreateListTail(L1,5);
int i=0;
int *data=&i;//指针不能悬空!!!
int flag= InsertElem(L,2,7);
DeletElem(L,2,data);
if(flag)
{
LinkList pp;
pp=L->next;
while(pp!=NULL)
{
cout<<pp->data;
pp=pp->next;
}
int flag=GetElem(L1,1,data);
cout<<*data;
}
else cout<<"ERROR!";
return 0;
}
//---------------------------------------------------------------------
error: stray ‘\357’ in program
error: stray ‘\357’ in program
error: stray ‘\274’ in program
error: stray ‘\233’ in program
出现此类错误的原因,在编辑器中使用的utf-8的格式保存源代码中出现了中文的标点符号
//---------------------------------------------------------------------
记住两个原则
1.函数传递的参数都是复制品
2.指针存储的是地址