第三次作业单链表,简单写的(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;
}