#include <stdio.h> #include "Slink.h" int main(void) { SLink *L; int i = 0; char e = '0'; //认真体会C语言拷贝传递的思想 InitList(&L); InsElem(L, 'a', 1); InsElem(L, 'b', 2); InsElem(L, 'c', 3); InsElem(L, 'd', 4); InsElem(L, 'e', 5); printf("线性表"); DispList(L); printf("长度:%d/n",GetLength(L)); i = 3; GetElem(L, i, &e); printf("第%d个元素:%c/n", i, e); e = 'a'; printf("元素%c是第%d个元素/n", e, Locate(L, e)); i = 4; printf("删除第%d个元素/n", i); DelElem(L, i); printf("线性表:"); DispList(L); /**/ return 0; }
#ifndef SLINK #define SLINK typedef struct node { char data; struct node *next; }SLink; extern void InitList(SLink **L); extern int GetLength(SLink *L); extern int GetElem(SLink *L, int num, char *e); extern int Locate(SLink *L, char x); extern int InsElem(SLink *L, char x, int num); extern int DelElem(SLink *L, int num); extern void DispList(SLink *L); #endif
#include <stdio.h> #include "Slink.h" #include <malloc.h> /************************************************ ** 函数名:void InitList(SLink **L) ** 功能: 初始化线性表运算 ** 描述: 无 ** 作者: 庞辉 *************************************************/ void InitList(SLink **L) //因为C语言没有引用的概念,故需要使用多重指针 { *L = (SLink *)malloc(sizeof(SLink)); (*L)->next = NULL; } /************************************************ ** 函数名:int getLength(SLink *L) ** 功能: 获取链表的长度 ** 描述: 无 ** 作者: 庞辉 *************************************************/ int GetLength(SLink *L) { int num = 0; SLink *p = L->next; while(p != NULL) //直到p指向尾指针, { num++; p = p->next; } return num; } /************************************************ ** 函数名:int GetElem(SLink *L, int num, char *e) ** 功能: 求线性表中第i个元素运算 ** 描述: 出错返回-1,成功返回0 ** 作者: 庞辉 *************************************************/ int GetElem(SLink *L, int num, char *e) { SLink *p = L->next; int i = 1; if(num < 1 || num > GetLength(L)) { return -1; } while(i < num) { p = p->next; i++; } *e = p->data; return 0; } /************************************************ ** 函数名:int Locate(SLink *L, char x) ** 功能: 求某元素在线性表中的位置 ** 描述: 出错返回-1,成功返回位于线性表第几个元素 ** 作者: 庞辉 *************************************************/ int Locate(SLink *L, char x) { SLink *p = L->next; int i = 1; while(p != NULL && p->data != x) { p = p->next; i++; } if(p == NULL) { return -1; } else { return i; } } /************************************************ ** 函数名:int InsElem(SLink *L, char x, int num) ** 功能: 在线性表某个位置插入某元素 ** 描述: 出错返回-1 ** 作者: 庞辉 *************************************************/ int InsElem(SLink *L, char x, int num) { SLink *p = L; //这里是L,其它部分函数都是L->next int i = 1; SLink *q = (SLink *)malloc(sizeof(SLink)); //vc6.0的编译器太老,定义必须放在开头 if(num < 1 || num > GetLength(L) + 1) { free(q); //一定要避免内存泄露 return -1; } q->data = x; while(i < num) //此时指向待插入位置结点的前一个结点 { p = p->next; i++; } q->next = p->next; p->next = q; return 0; } /************************************************ ** 函数名:int DelElem(SLink *L, int num) ** 功能: 删除线性表某位置的元素 ** 描述: 出错返回-1 ** 作者: 庞辉 *************************************************/ int DelElem(SLink *L, int num) { SLink *p =L; //这里是L,其它部分函数都是L->next SLink *q; int i = 1; if(num < 1 || num > GetLength(L)) { return -1; } while(i < num) //此时指向待删除位置结点的前一个结点 { p = p->next; i++; } q = p->next; //q指向待删除的结点 p->next = q->next; free(q); return 0; } /************************************************ ** 函数名:void DispList(SLink *L) ** 功能: 输出线性表 ** 描述: 无 ** 作者: 庞辉 *************************************************/ void DispList(SLink *L) { SLink *p = L->next; while(p != NULL) { printf("%c ",p->data); p = p->next; } printf("/n"); }