链表的操作【记录】

 

#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.指针存储的是地址

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值