线性表的两种存储方式--顺序存储和链式存储

线性表是一种存储方式,可以想象是很多个车厢连起来的火车。每个车厢有两个区域,一个存放数据一个链接下一节车厢。
线性表的一些基本操作。初始化,增加元素,删除元素,查找元素,输出表中元素。

链式存储
例如链表一样通过指针把不同区域的数据联系起来形成顺序存储。

#include
#include
typedef struct node *list;//node重命名为指针*list
struct node{              //建立结构体
	int data;             //数据域
	list next;            //指针域
};                         
                           //提前声明函数
list findlist(int a,list head);  //查找函数
void delelist(int a,list head);   //删除函数
void insert(int a,int x,list head);   //增加函数
void printflist(list head);     //输出函数
list Initlist()                 //初始化函数
{
	list head;                 //声明一个指针变量head
	head=(list)malloc(sizeof(list));//给head分配空间
	head->next=NULL;          //给head指针域指空
	head->data=0;			//数据域为0,头节点数据域一般不存储数据
	return head;			//返回头节点指针
}
list findlist(int a,list head)   //查找函数,在以head为头节点的表中查找数据a,
{
	list p=head->next;      //声明一个指针p,把head指针域赋值给它
	while(p){				//循环直到找到这个元素
		if(p->data==a){
			printf("找到该元素\n");
			return p;			//找到了返回该结点指针
		}else{					//继续找下一个节点
			p=p->next;
		}
	}
	printf("表中没有这个元素!\n");
	return NULL;
}
void delelist(int a,list head)		//删除元素a
{
	list p=head->next,last=head->next;	//申明两个指针一个记录当前节点,一个记录上一个节点
	while(p){
		if(p->data==a){
			last->next=p->next;	//上一个节点的指针域变为下一个节点的指针域
			head->data--;	//head->data表示表中的数据个数
			printf("已删除该元素\n表中现存元素:");
			printflist(head);
			printf("\n");
			return;
		}else{
			last=p;
			p=p->next;
		}
	}
	printf("表中没有这个元素!\n");
	return;
}
void insert(int a,int x,list head)
{
	list p=head,node;
	int i=0;
	if(x==1){		//插入的是第二个节点
		node=(list)malloc(sizeof(list));
	 	node->data=a;
	 	node->next=NULL;
	 	p->next=node;
	 	head->data++;
	 	printf("已插入元素%d\n表中现存元素:",a);
		printflist(head);
		printf("\n");
		return;
	}else{
		p=p->next;
		 while(p){ 
		 	i++;
		 	if(i==x-1){
		 		node=(list)malloc(sizeof(list));
		 		node->data=a;
		 		node->next=p->next;
		 		p->next=node;
		 		head->data++;
		 		printf("已插入元素%d\n表中现存元素:",a);
		 		printflist(head);
		 		printf("\n");
		 		return;
			 }else{
			 	p=p->next;
			 }
		 }
	}
	 printf("未插入该元素!\n"); 
}
void printflist(list head)
{
	list p=head->next;
	printf("元素个数%d\n",head->data);
	while(p){
		printf("%d ",p->data);
		p=p->next;
	}
	printf("\n");
}
int main()
{
	list head;
	head=Initlist();
	printflist(head);
	insert(1,1,head);
	insert(2,2,head);
//	findlist(2,head);
//	delelist(2,head);
//	printflist(head);
	
}

顺序储存
像数组一样

#include
#include 
struct Node{
	int data[101];
	int last;
};
typedef struct Node *list;
void delelist(int a,list node);
void insert(int a,int x,list node);
void printflist(list node);
list Initlist()
{
	list node;
	node=(list )malloc( sizeof(struct Node) );
	node->last=-1;
	return node;
}
int findlist(int a,list node)
{
	int i=0;
	while(i<=node->last){
		if(node->data[i]==a){
			printf("%d这个数在第%d位\n",a,i+1);
			return i;
		}
		i++;
	}
	printf("表中没有%d这个数!",a); 
	return -1;
}
void delelist(int a,list node)
{
	int i=0,n;
	while(i<=node->last){
		if(node->data[i]==a){
			break;
		}
		i++;
	}
	while(i+1<=node->last){
		node->data[i]=node->data[i+1];
		i++;
	}
	node->last--;
	printf("%d被删除成功\n删除后数列:",a);
	printflist(node);
}
void insert(int a,int x,list node)
{
	for(int i=node->last;i>x-1;i--){
		node->data[i+1]=node->data[i];
	}
	node->data[x-1]=a;
	node->last++;
}
void printflist(list node){
	printf("表中数列情况:"); 
	int i=0;
	if(node->last==-1){
		printf("表空\n"); 
	}
	while(i<=node->last){
		printf("%d  ",node->data[i++]);
	}
}
int main()
{
	list head;
	head=Initlist();
	printflist(head);
	insert(1,1,head);
	insert(2,2,head);
	findlist(2,head);
	delelist(2,head);
	printflist(head);
	return 0;
}

你可能感兴趣的:(链表,数据结构)