数据结构试验-Linklist

    第三次作业单链表,简单写的(VS2010)。

    main函数调用部分:

#include <stdio.h>
#include "linklist.h"
int main()
{
	elemtype data;
	linklist lk;
	initlinklist(&lk);
	push_back(lk,'a');
	push_back(lk,'b');
	push_back(lk,'c');
	push_back(lk,'d');
	push_back(lk,'e');
	displist(lk);
	printf("\nlength: %d\n",linklength(lk));
	getelem(lk,3,&data);
	printf("3: ");
	print(data);
	printf("\n'd' at: %d\n",locateelem(lk,'d'));
	listinsert(lk,4,'f');
	displist(lk);
	printf("\n");
	listdelete(lk,3,&data);
	displist(lk);
	printf("\n");
	destroylist(lk);
	return 0;
}

    linklist.h部分:

#ifndef __LINKLIST_H__
#define __LINKLIST_H__

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include "linklist.h"

#define NONE  -1
#define ERROR -1
typedef char elemtype;
typedef struct T{
	elemtype data;
	struct T *next;
}lnode,*linklist;

/* 初始化单链表 */
void initlinklist(linklist* link);
/* 摧毁单链表 */
void destroylist(linklist link);
/* 是否为空 */
int  listempty(linklist link);
/* 返回单链表长度 */
int  linklength(linklist link);
/* 得到cur_e上一个数据 */
void priorelem(linklist link,elemtype cur_e,elemtype *pre_e);
/* 得到cur_e下一个数据 */
void nextelem(linklist link,elemtype cur_e,elemtype *next_e);
/* 打印数据 */
void displist(linklist link);
/* 打印数据 */
void print(elemtype data);
/* 得到i位置的数据 */
void getelem(linklist link,int i,elemtype* e);
/* 返回data第一次出现的位置 */
int  locateelem(linklist link,elemtype data);
/* 在指定位置插入数据 */
void listinsert(linklist link,int i,elemtype data);
/* 删除指定位置数据 */
void listdelete(linklist link,int i,elemtype* data);
/* 清空单连表 */
void clearlist(linklist link);
/* 尾部插入数据 */
void push_back(linklist link,elemtype data);
/* 排序 */
void sortlist(linklist link);

#endif

    linklist.h部分:

#include "linklist.h"

void initlinklist(linklist* link){

  *link=(linklist)malloc(sizeof(lnode));
  (*link)->data = 0;
  (*link)->next = NULL;

}
void destroylist(linklist link){
  
	linklist templink;
	while(link){
	   templink = link->next;
	   free(link);
	   link = templink;
	}

}
int listempty(linklist link){
  return !(link->data);
}
int linklength(linklist link){
  return link->data;
}
void priorelem(linklist link,elemtype cur_e,elemtype *pre_e){

  while(!link->next&&link->next->data!=cur_e) link=link->next;
  if(!link->next) *pre_e = NONE;
  else *pre_e = link->data;

}
void nextelem(linklist link,elemtype cur_e,elemtype *next_e){

  while(!link&&link->data!=cur_e) link=link->next;
  if(!link||!link->next) *next_e = NONE;
  else *next_e = link->next->data;

}
void displist(linklist link){
  if(!link->data) return;
  link = link->next;
  while(link->next){
    print(link->data);
	printf("->");
	link=link->next;
  }
  print(link->data);
}
void print(elemtype data){

  switch(sizeof(elemtype)){
    case 1: printf("%c",data); break;
	case 4: printf("%d",data); break;
	case 8: printf("%lf",data); break;
	default: printf("ElemType is unknow.");
  }

}
void getelem(linklist link,int i,elemtype* e){
	
	if(i > link->data){
		*e = ERROR;
		return;
	}
	while(i--) link=link->next;
	*e = link->data;

}
int locateelem(linklist link,elemtype data){
  int i=0;
  link=link->next;
  while(++i,link){
	if(link->data==data) break;
	link=link->next;
  }
  if(!link) return 0;
  return i;
}
void listinsert(linklist link,int i,elemtype data){

  linklist lk;
  if(i>link->data+1) exit(1);
  link->data++;
  while(--i) link=link->next;
  lk=(linklist)malloc(sizeof(lnode));
  lk->next = link->next;
  lk->data = data;
  link->next = lk;

}
void listdelete(linklist link,int i,elemtype* data){

  linklist templink;
  if(i>link->data) exit(1);
  link->data--;
  while(--i&&link->next) link=link->next;
  *data = link->next->data;
  templink = link->next;
  link->next=link->next->next;
  free(templink);

}
void clearlist(linklist link){
  
  linklist templink=link->next;
  link->data=0;
  link->next=NULL;
  link = templink;

  while(link){
    templink = link->next;
	free(link);
	link = templink;
  }
}
void push_back(linklist link,elemtype data){
  linklist lk;
  link->data++;
  while(link->next) link=link->next;
  lk = (linklist)malloc(sizeof(lnode));
  lk->data = data;
  lk->next = NULL;
  link->next = lk;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值