赞
踩
1:顺序存储实现(数组实现)
Data: a1 a2 .....ai ai+1 .... an ....
- typedef struct LNode *List; //指向LNode的指针,这是typedef的,你可以随时声明,而不加typedef只是创建一个
- struct LNode{ //结构体成员
- ElementType Data[MAXSIZE]; //数组
- int Last;
- };
- struct LNode L; //声明实例
- List PtrL; //声明PtrL指针变量
访问第i个元素:L.Data[i]或者Ptr->Data[i]
线性表长度:L.Last+1或者PtrL->Last+1
1>初始化
- List MakeEmpty() //返回List指针
- {
- List Ptrl;
- Ptrl = (List)malloc(sizeof(struct LNode)); //动态创建LNode,需要指向该结构的指针
- Ptrl->Last = -1; //通常通过判断或者使得Last = -1,来使得一个新的空链表时初始化
- return Ptrl;
- }
2>查找
- int Find(ElementType X, List PtrL)
- {
- int i = 0;
- while(i <= PtrL->Last && PtrL -> Data[i] != X) //Last 是链表中最后一个元素的索引而不是元素个数,因为结构体中的Last声明过
- i++;
- if(i > PtrL -> Last)
- return -1;
- else return i;
- }
3>插入
先移动、再插入,比如在i位置插入x元素,要把i-1后面的元素全部向右移动一位
- void Insert(ElementType X,int i,List Ptrl)
- {
- int j;
- if(PtrL -> Last == MAXSIZE -1){
- print("表满");
- return;
- }
- if(i < 1 || i > PtrL ->Last + 2){
- printf("位置不合法");
- return;
- }
- for(j = Ptrl -> Last;j >= i-1;j- -)
- PtrL -> Data[j+1] = PrL -> Data[j]; //循环把j位置的元素给到j+1位置的元素
- PtrL -> Data[i-1] = X; //把i-1位置的元素替换成X
- PtrL -> Last++; //Last+1
- return
- }

4>删除
先删除、再移动
- void Delete(int i ,List PtrL)
- {
- int j;
- if(i < 1 || i > PtrL -> Last + 1){
- printf("不存在第%d个元素",i);
- return;
- }
- for(j=i ; j <= PtrL -> Last; j++)
- PtrL-> Data[j-1] = PtrL -> Data[j]; //循环把i+1位置的元素向左移动
- PtrL -> Last- -;
- return;
- }
2:链式存储实现
不要求逻辑相邻的两个元素物理上也相邻,通过“链”建立起元素上的逻辑关系
它的元素定义如下:它不再使用数组和int类型的末尾元素,而是Data和Next
- typedef struct LNode *List;
- struct LNode{
- ElementType Data;
- List Next;
- };
- struct LNode L;
- List PtrL;
链表由多个这样的“元素”连接而成,PtrL是指向该元素的指针,Next是指向下一个元素的指针,简单来说,Ptrl就是头指针,Next是尾指针
1>求表长
- int Lenth(List PtrL) //只知道链表的头指针,单向链表
- {
- List p = PtrL; //临时指针P指向链表头
- int j = 0;
- while(p){ //p指针不结束
- p = p -> Next; //指向下一个
- j++;
- }
- return j;
- }
2>查找
按序号查找:FindKth; (查找位于第K号的元素)
- List FindKth(int K,List PtrL)
- {
- List p = PtrL;
- int i = 1;
- while(p != NULL && i < K){
- p = p-> Next;
- i++;
- }
- if(i == K) return p; //找到第K个,返回指针
- else return NULL; //没找到返回空
- }
3->插入
①s指向新节点
②p指向链表的第i-1个节点
找到修改指针,插入节点
③把s指针赋给p指针的下一位,p -> Next = s;
④把p的下一位赋值给s的下一位
- List Insert(ElementaType X ,int i , List PtrL) //在i位置插入元素X
- {
- List p ,s; //两个临时指针p,s
- if(i == 1){ //如果在表头插入
- s = (List)malloc(sizeof(struct LNode)); //(List) 将 malloc 返回的指针转换为 List 类型的指针,指向struct的指针
- s -> Data = X;
- s -> Next = PtrL; // 把原来的头指针给新元素的尾指针
- return s;
- }
- p = FindKth(i-1 , PtrL); //查找位于i-1位置的元素,把指向该位置的指针赋值给p
- if(p == NULL){
- printf("参数i错误");
- return NULL;
- }
- else{
- s = (List)malloc(sizeof(struct LNode));
- s -> Data = X;
- s -> Next = p -> Next; //s是新元素
- p -> Next = s;
- return PtrL;
- }

4->删除
①找到i-1个节点,用p指向
②用s指向要被删除的节点(p的next)
③修改指针,删除s指向节点
④释放s空间
- List Delete(int i ,List PtrL)
- {
- List s, p;
- if( i == 1){
- s = PtrL;
- if(PtrL != NULL) PtrL = PtrL -> Next //从链表中删除s
- else return NULL;
- free(s); //释放s空间
- return PtrL;
- }
- p = FindKth(i-1 , PtrL); //查找i-1个节点
- if(p = = NULL){
- printf("第%d个节点不存在",i-1);return NULL;
- }else if( p -> Next == NULL){
- printf("第%d个节点不存在",i);return NULL;
- }else{
- s = p -> Next;
- p -> Next = s -> Next;
- free(s);
- return PtrL;
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。