现在的位置: 首页 > 综合 > 正文

单链表的基本操作

2018年02月23日 ⁄ 综合 ⁄ 共 2093字 ⁄ 字号 评论关闭

最近在看数据结构的知识点,自己对数据结构的掌握不是很好,所以就把弱的地方提炼出来,以便以后查看。

#include<stdio.h>
#include<stdlib.h>

#define ERROR 0;
#define OK 1;

typedef struct Node
{
	int data;
	struct Node *next;
};
struct Node *LinkList;


//初始化单链表
void initList()
{
	LinkList = (struct Node *)malloc(sizeof(struct Node *));	//建立头结点
	LinkList->next = NULL;			//建立空的单链表L
}


//头插法建立单链表
void creatFromHead()
{
	struct Node *s;
	char c;
	int flag=1;
	printf("头插法建立单链表,输入字符,输入$结束...\n");
	
	while(flag)
	{
		c=getchar();
		if(c != '$')
		{
			s=(struct Node *)malloc(sizeof(struct Node));
			s->data = c;
			s->next = LinkList->next;
			LinkList->next = s;
		}
		else 
			flag = 0;
	}
}


//尾插法建立单链表
void creatFromTail()
{
	struct Node *r,*s;
	int flag=1;
	char c;
	printf("尾插法建立单链表,输入字符,输入$结束...\n");
	
	r = LinkList;		//r指针指向当前表尾
	while(flag)
	{
		c = getchar();
		if(c != '$')
		{
			s = (struct Node *)malloc(sizeof(struct Node));
			s->data = c;
			r->next = s;
			r = s;
		}
		else
		{
			flag = 0;
			r->next = NULL;		//将尾节点的next域置为空,表示链表的结束
		}
	}
}


//按序号查找
void get(int i)
{
	int j;
	struct Node *p;
	
	if(i<=0)
	{
		printf("输入的位置不存在!\n");
	}	
	p=LinkList;
	j=0;
	while((p->next != NULL)&&(j<i))
	{
		p=p->next;  //扫描下一个节点
		j++;		//已扫描节点数
	}
	if(i==j)
		printf("查到的值是:%d\n",p->data);	//找到了第i个结点
	else
		printf("没找到!\n");
}


//按值查找
struct Node *Locate(int e_data)
{
	struct Node *p;
	printf("输入要查找的数据!\n");
	p=LinkList->next;	//从表中第一个结点开始
	while(p != NULL)
	{
		if(p->data != e_data)
			p = p->next;
		else
			break;			//找到结点值是e_data时推出循环		
	}
	return p;
}


//插入操作
int insert(int i,int e_data)
{
	struct Node *pre,*s;
	int j=0;
	printf("输入要插入的数字和位置!\n");
	pre=LinkList;	//从头开始,查找第i-1个结点
	if(i<1)
		return ERROR;
	while((pre != NULL) && (j<i-1))	//表没有查完,并且没有查到i-1处时,重复
	{
		pre = pre->next;
		j++;
	}
	
	if(!pre)	//当前位置pre为空,表示已找完还未数到第i个,说明插入位置不合理
	{
		printf("插入位置不合法\n");
		return ERROR;
	}
	
	s = (struct Node *)malloc(sizeof(struct Node));	//申请一个新节点s
	s->data = e_data;	
	pre->next = s->next;
	pre->next = s;
	return OK;
}


// 删除操作
int delList(int i,int *e_data)
{
	struct Node *pre,*r;
	
	int k = 0;
	printf("输入要删除的数字的位置,以及数字!\n");
	pre=LinkList;
	
	while((pre->next !=NULL) && (k<i-1))
	{
		pre = pre->next;
		k++;
	}
	
	if(!(pre -> next))	//pre->next为空,说明删除的节点位置i不合法
	{
		printf("删除位置不合法\n");
		return ERROR;
	}
	
	r = pre->next;
	pre->next = pre->next->next;
	*e_data = r->data;
	
	free(r);		//释放被删除结点所占的内存空间
	return OK;
}


int main()
{
	int i=0;
	int offset;
	struct Node *p;
	p = (struct Node *)malloc(sizeof(struct Node));
	
	initList();
	
	creatFromHead();
	printf("头插法创建成功!\n");

	//按序号查找
	printf("输入要查找数据的序号!\n");
	scanf("%d",&offset);
	get(offset);	
	
	return 0;
}

抱歉!评论已关闭.