C语言线性单链表相关函数和算法的基本实现

备考期间尝试写了一些基本数据结构的C语言实现,现做以下记录(基本数据元以int型为例):

全局定义及依赖:

#include <stdio.h> 
#include <stdlib.h>
#define OK  1
#define ERROR  0
#define END NULL

链表结点定义:

typedef struct Lnode
{
	int data;
	struct Lnode *next;
}Node,*linkedList;

链表初始化:

//初始化链表 
linkedList initList()
{
	Node *L;
	L = (Node *)malloc(sizeof(Node));
	if(L==NULL)
	{
		printf("Init error!");
	}
	L->next = NULL;
	printf("Init OK!\n");
	return L;
}
头插法生成链表 即在头结点后插入新元素 :
//头插法生成链表 即在头结点后插入新元素 
linkedList createListH(int n)
{
	int i = 0;
	Node *L;
	L = (Node *)malloc(sizeof(Node));
	L->next = NULL;
	
	int x;
	while(i<n)
	{
		scanf("%d",&x);
		Node *p;
		p = (Node *)malloc(sizeof(Node));
		p->data = x;
		p->next = L->next;
		L->next = p;
		i++;
	}
	return L;
}
尾插法生成链表 即在尾结点后插入新元素:
//尾插法生成链表 即在尾结点后插入新元素
linkedList createListT(int n)
{
	int i = 0;
	Node *T;
	T = (Node *)malloc(sizeof(Node));
	T->next = NULL;
	
	Node *r;
	r = T;
	int x;
	while(i<n)
	{
		scanf("%d",&x);
		Node *p;
		p = (Node *)malloc(sizeof(Node));
		p->data = x;
		r->next = p;
		r = p;
		i++;
	}
	r->next = NULL;
	return T;
}

计算链表长度:

//calculate the length
int calculateLength(linkedList L)
{
	int length = 0;
	Node *p = L;
	while(p->next)
	{
		length++;
		p = p->next;
	}
	return length;
} 

在指定链表的指定索引处插入新值:

//insert element into index x
int insertElementIntoX(linkedList L,int index,int e)
{
	Node *p = L;
	int length = calculateLength(L);

	if(index<1||index>length+1){return ERROR;}
	else
	{
		for(int i = 1;i<index;i++)
		{
			p = p->next;
		}
		Node *q = (Node *)malloc(sizeof(Node));
		q->data = e;
		q->next = p->next;
		p->next = q;
		return OK;
	}
}

通过索引删除指定链表中的元素:

//delete element by index
int deleteElementByIndex(linkedList L,int index)
{
	int length = calculateLength(L);
	if(index<1||index>length){return ERROR;}
	else
	{
		Node *p = L;
		for(int i = 1;i<index;i++)
		{
			p = p->next;
		}
		Node *q = p->next;
		p->next = q->next;
		free(q);
		return OK;
	}
}

遍历并打印链表中所有结点元素:

//遍历 
void traversalList(linkedList L)
{
	Node *p = L->next;
	while(p!=END)
	{
		printf("%d ",p->data);
		p = p->next;
	}
	printf("\n");
}

对两个链表做非递减归并:

linkedList mergeDecline(linkedList La,linkedList Lb)
{
	Node *a = La->next;
	Node *b = Lb->next;
	free(La);
	free(Lb);
	linkedList Lc = initList();
	Node *temp = Lc;
	while(a!=NULL&&b!=NULL)
	{
		if(a->data<=b->data)
		{
			temp->next = a;
			a = a->next;
			temp = temp->next; 
		}
		else
		{
			temp->next = b;
			b = b->next;
			temp = temp->next;
		}
	}
	temp->next == NULL;
	if(a!=NULL){temp->next = a;}
	if(b!=NULL){temp->next = b;}
	return Lc;
}

删除给定链表中所有重复元素(对重复元素只保留其中一个):

//delete repeating node  
void deleteRepeatingNode(linkedList L)
{
	Node *p,*q,*r;
	p = L->next;
	if(p==NULL){return;}
	while(p->next)
	{
		q = p;
		while(q->next)
		{
			if(q->next->data==p->data)
			{
				r = q->next;
				q->next=r->next;
				free(r);
			}
			else
			{
				q = q->next;
			}
		}
		p = p->next;
	}
}

将链表中的元素按从小到大进行排序:

//sort from small to large
int sortFSL(linkedList L)
{
	if(L->next==NULL){return ERROR;}
	else
	{
		Node *r = L;
		Node *p = r->next;
		Node *q = p->next;
		while(p->next)
		{
			while(q)
		    {
			  if(p->data>q->data)
			  {
				   int e = p->data;
				   p->data = q->data;
				   q->data = e;
				   q = q->next;
			  }
			
			  else
			  {
				  q = q->next;
			  }
		    }
		    
		    r = r->next;
		    p = p->next;
		    q = p->next;
		}
		return OK;
	}
	
}

删除链表中所有元素值大于x的结点:

int deleteAGTX(linkedList L,int x) 
{
	if(L->next==NULL){return ERROR;}
	else{
		Node *p = L;
		while(p->next)
		{
			if(p->next->data>x)
			{
				Node *temp = p->next;
				p->next = p->next->next;
				free(temp);
			}
			else{
				p = p->next;
			}
		}
		return OK;
	}
}

将链表中所有负数前置并排序:

//负数在前排序 
int negativePriority(linkedList L)
{
	if(L->next==NULL){return ERROR;}
	else{
		Node *p = L;
		while(p->next)
		{
			if(p->next->data<0)
		    {
			  Node *temp = p->next;
			  p->next = temp->next;
			  temp->next = L->next;
			  L->next = temp;
		    }
		    else{p = p->next;}
		}
		return OK;
	}
} 

南京航空航天大学922部分真题:

//2014真题-数据结构6
int _2014_T6(linkedList L)
{
	if(L->next==NULL){return ERROR; }
	else{
		Node *p = L;
		Node *t = NULL;
		Node *s = NULL;
		int count = 1;
		while(p->next)
		{
			if(count%2==0)
			{
				t = p->next;
				p->next = p->next->next; //关键步骤 
				t->next = s;
				s = t;
			}
			else{
				p = p->next;
			}
			count++;
		}
		p->next = s;
		return OK;
	}
} 

//2015真题数据结构6
int _2015_T6(linkedList L)
{
	if(L->next==NULL){return ERROR; }
	else{
		Node *p = L->next;
		Node *q = L->next;
		Node *t = L;
		Node *top = NULL;
		while(p->next)
		{
			while(q->next)
			{
				if(q->next->data>p->data)
				{
					p = q->next;
					t = q;
					q = q->next;
				}
				else{
					q = q->next;
				}
			}
			t->next = t->next->next;
			p->next = top;
			top = p;
			t = L;
			p = q = L->next;
		}
		p->next = top;
		return OK;
	}
} 

//2013真题数据结构6
int _2013_T6(linkedList La,linkedList Lb)
{
	if(La->next==NULL){return ERROR;}
	else{
		Node *a = La;
		Node *b = Lb;
		int element;
		while(a->next)
		{
			element = a->next->data;
			while(b->next)
			{
				if(b->next->data==element){break;}
				else{b = b->next;}
			}
			
			if(b->next==NULL)
			{
				Node *t = a->next;
				a->next = a->next->next;
				free(t);
			}
			else{a = a->next;} 
			b = Lb;
		}
		
		a = La;
		while(a->next)
		{
			Node *p = La->next;
			int e;
			while(p->next)
			{
				if(p->next->data>a->next->data)
				{
					e = a->next->data;
					a->next->data = p->next->data;
					p->next->data = e;
				}
				p = p->next;	
			}
			a = a->next;
		}
		return OK;
	}
}

//2011真题-数据结构24
int _2011_T24(linkedList L)
{
    if(L->next == NULL){return ERROR;}
    else{
    		Node *p = L;
	        int element = p->next->data;
	        while(p->next)
	        {
		       if(element>p->next->data)
		       {
			      element = p->next->data;
		       }
		       p = p->next;
	        }
	        p = L;
	        while(p->next)
	        {
	        	if(p->next->data==element)
	        	{
	        		Node *t = p->next;
	        		p->next = p->next->next;
	        		free(t);
	        		break;
	        	}
	        	p = p->next;
	        }
	        return OK;
    }
}

使用单链表实现数制转换(1-10进制):

//数制转换(1-10进制)
void transCodeR(int num,int r)
{
	linkedList L = initList();
	L->data = -1;
	Node *top = NULL;
	int i;
	while(num>0)
	{
		i = num%r;
		top = (Node *)malloc(sizeof(Node));
		top->data = i;
		top->next = L;
		L = top;
		num = num/r;
	}
	printf("The result is: ");
	while(top->data!=-1)
	{
		printf("%d ",top->data);
		top = top->next;
	}	
} 

测试:

int main()
{
	int n = 0;
	
	printf("Please enter the length:\n");
	scanf("%d",&n);
	linkedList La = createListT(n);
	printf("Traversal the list a:\n");
	traversalList(La);
	
	printf("Please enter the length:\n");
	scanf("%d",&n);
	linkedList Lb = createListT(n);
	printf("Traversal the list b:\n");
	traversalList(Lb);

    traversalList(mergeDecline(La,Lb)); //Merge
    
    printf("Please enter the length:\n");
	scanf("%d",&n);
	linkedList Ld = createListT(n);
	traversalList(Ld);
    deleteRepeatingNode(Ld);  //delete repeating node
    traversalList(Ld);
    
    int index,element;
    printf("Please enter the length:\n");
	scanf("%d",&n);
	linkedList Le = createListT(n);
	traversalList(Le);
	printf("Please enter the index:\n");
	scanf("%d",&index);
	printf("Please enter the element:\n");
	scanf("%d",&element);
	insertElementIntoX(Le,index,element);  //insert element into index x
	traversalList(Le);
	
	int index;
	printf("Please enter the length:\n");
	scanf("%d",&n);
	linkedList Lf = createListT(n);
	traversalList(Lf);
	printf("Please enter the index:\n");
	scanf("%d",&index);
	deleteElementByIndex(Lf,index);  //delete element by index
	traversalList(Lf);
	
    printf("Please enter the length:\n");
	scanf("%d",&n);
	linkedList Lg = createListT(n);
	traversalList(Lg);
	sortFSL(Lg);         //sort from small to large
	traversalList(Lg);
    
    int x;
    printf("Please enter the length:\n");
	scanf("%d",&n);
	linkedList Lh = createListT(n);
	traversalList(Lh);
	printf("Please enter the value:\n");
	scanf("%d",&x);
	deleteAGTX(Lh,x);         //P3-3-2-3-1 删除所有元素值大于x的结点
	traversalList(Lh);
	
    printf("Please enter the length:\n");
	scanf("%d",&n);
	linkedList Li = createListT(n);
	traversalList(Li);
	negativePriority(Li);         //负数在前排序
	traversalList(Li);
	
	printf("Please enter the length:\n");
	scanf("%d",&n);
	linkedList Lj = createListT(n);
	traversalList(Lj);
	_2014_T6(Lj);         //2014真题-数据结构6
	traversalList(Lj);
	
	printf("Please enter the length:\n");
	scanf("%d",&n);
	linkedList Lk = createListT(n);
	traversalList(Lk);
	_2015_T6(Lk);         //2015真题-数据结构6
	traversalList(Lk);
	
	printf("Please enter the length:\n");
	scanf("%d",&n);
	linkedList Ll = createListT(n);
	traversalList(Ll);
	printf("Please enter the length:\n");
	scanf("%d",&n);
	linkedList Lm = createListT(n);
	traversalList(Lm);
	_2013_T6(Ll,Lm);         //2013真题-数据结构6
	traversalList(Ll);
	
    printf("Please enter the length:\n");
	scanf("%d",&n);
	linkedList Ln = createListT(n);
	traversalList(Ln);
	_2011_T24(Ln);
	traversalList(Ln);  //2011真题-数据结构24
	
	int num;
	printf("Please enter the num:\n");
	scanf("%d",&num);
	printf("Please enter the r:\n");
	scanf("%d",&n);
	transCodeR(num,n);
	
	return 0;
}


  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值