什么是链式存储:
1:用一组任意的存储单元存储线性表的数据元素,这组存储单元可以存在内存中未被占用的任意位置。
2:链式存储结构中,除了要存储数据元素信息外,还要存储它的后继元素的存储地址(指针)。
3:存储数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域。这两部分信息组成数据元素称为存储映像,称为结点(Node)。
单链表的删除插入操作:
代码实现:查找,初始化,插入,删除
—操作实现
/*srand(time(0))?;//先设置种子
rand();//然后产生随机数
Srand是种下随机种子数,你每回种下的种子不一样,用Rand得到的随机数就不一样。
为了每回种下一个不一样的种子,所以就选用Time(0),Time(0)是得到当前时时间值
(因为每时每刻时间是不一样的了)。
*/
#include <time.h>
#include <iostream>
using namespace std;
#include <stdlib.h> //malloc(),free(),srand(),rand()的头文件
#define MAXSIZE 20
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
typedef struct Node
{
ElemType data; // 数据域
struct Node* Next; // 指针域
} Node;
typedef struct Node* List;
/* 操作结果:用e返回L中第i个数据元素的值 */
Status GetElem(Node *L, int i, ElemType *e){
List p;
p = L;
int j = 1;
for( ; j <= i&& p ; j++){
p = p->Next;
}
if(!p ){
return ERROR;
}
*e = p->data;
return OK;
}
/* 操作结果:删除L的第i个数据元素,并用e返回其值. */
Status ListDelete(Node *L,int i, ElemType *e){
List p,q;
p = L;
int j = 1;
while(p->Next && j < i){
p = p->Next;
j++;
}
if(!(p->Next) || j > i){
return ERROR;
}
*e = p->Next->data;
q = p->Next->Next;
free(p->Next);
p->Next = q;
/* q = p->next; p->next = q->next; free(q); 也可这么写*/
return OK;
}
/* 操作结果:在L中第i个位置之前插入新的数据元素e. */
Status ListInsert(Node *L, int i, ElemType e){
List p,s;
p = L;
int j = 1;
while(p && j< i){
p = p->Next;
j++;
}
if(!p || j > i){
return ERROR;
}
s = (List ) malloc(sizeof(Node)); // sizeof()是操作符,不需要添加头文件
s->data = e;
s->Next = p->Next;
p->Next = s;
return OK;
}
/* 头插法建立单链表示例 */
void CreateListB(List *L, int n){
Node *p;
//srand(time (0));
*L = (List)malloc(sizeof(Node)); // 生成头结点
(*L)->Next = NULL;
for(int i = 0 ; i < n ; i++ ) {
p = (List)malloc(sizeof(Node));
p->data = rand()%10+1;
p->Next = (*L)->Next;
(*L)->Next = p;
}
}
/* 尾插法建立单链表演示 */
void CreateListA(List *L, int n){
List p , r;
//srand(time(0));
*L = (List)malloc(sizeof(Node));
r = *L;
for(int i = 0 ; i < n ; i++){
p = (List) malloc(sizeof(Node));
p->data = rand()%10+1;
r->Next = p;
p->Next = NULL;
r = p;
}
//cout<<L->data;
}
/*打印整个链表*/
void PrintfList(Node *L){
Node *p = L->Next;
while(p){
cout<<p->data<<" ";
p = p->Next;
}
cout<<endl;
}
int main(){
cout<<"头插法检测"<<endl;
Node *headA;
CreateListA(&headA,5);
PrintfList(headA);
/*检测,查找,插入,删除操作*/
ElemType i = 0;
cout<<"查找位置1的元素"<<endl;
GetElem( headA , 1, &i);
cout<<i<<endl;
cout<<"删除位置1的元素"<<endl;
ListDelete(headA,1, &i);
PrintfList(headA);
cout<<"位置1插入元素"<<endl;
ListInsert(headA, 1 , i);
PrintfList(headA);
cout<<"----------------------------------------------------------------------"<<endl;
cout<<"尾插法检测"<<endl;
Node *headB;
CreateListB(&headB,5);
PrintfList(headB);
/*检测,查找,插入,删除操作*/
ElemType I = 0;
cout<<"查找位置1的元素"<<endl;
GetElem( headB , 1, &I);
cout<<I<<endl;
cout<<"删除位置1的元素"<<endl;
ListDelete(headB,1, &I);
PrintfList(headB);
cout<<"位置1插入元素"<<endl;
ListInsert(headB, 1 , I);
PrintfList(headB);
return 0;
}