数据结构(C语言版)链表相关操作算法的代码实现

  这次实现的是带头结点的单链表的初始化、遍历、创建、插入、删除、判断链表是否为空、求链表长度函数,编译环境是vs2013。

  其中插入和删除函数中循环的条件目前还不太明白。

#include<iostream>
using namespace std;
typedef int Status;
typedef char Elemtype;
//定义链表的存储结构,注意这里与算法的定义有一处不同,是定义结构体时就命名Lnode,说明*next的类型只要说是Lnode类型就可以
typedef struct Lnode{
    Elemtype data;
    Lnode *next;
}Lnode, *LinkList;
//各函数声明部分
Status InitLinkList(LinkList &L);//初始化
Status CreateList(LinkList &L, int length);//创建链表
Status TraverseList(LinkList L);//遍历
Status GetLength(LinkList L);//求长度
Status IsEmpty(LinkList L);//判断是否为空
Status InsertList(LinkList &L, int target, Elemtype e);//第target个元素前插入元素
Status DeleteList(LinkList &L, int target, Elemtype &e);//删除第target元素
void main(){
    LinkList link=NULL;
    int n=5;
    InitLinkList(link);
    CreateList(link, n);
    //printf("%d",GetLength(link));
    //char *s = IsEmpty(link)?"链表为空!":"链表不为空!";
    //printf("判断结果:%s\n", s);
    //InsertList(link, 2, '3');
    Elemtype e;
    DeleteList(link,5,e);
    printf("删除的元素是:%c\n", e);
    TraverseList(link);
    getchar();

}
//链表初始化函数:创建头指针,指针域赋空值
Status InitLinkList(LinkList &L){
    L = (LinkList)malloc(sizeof(Lnode));
    if (!L){
        return false;
    }
    L->next = NULL;
    return true;
}
//创建链表函数:
Status CreateList(LinkList &L, int length){
    LinkList p=NULL, q=NULL;
    q = L;
    q->next;
    for(int i = 0; i <length; i++){
        p = (LinkList)malloc(sizeof(Lnode));
        if (!p){
            return false;
        }
        printf("输入存入链表的字符:\n");
        scanf_s("%c", &p->data);
        //2016.4.11报错原因:微软改写了c的函数,加入了参数检测
        //方法:将scanf()函数改为scanf_s()函数
        getchar();
        //2016.4.12循环只读入了第一次,原因是vs不读入回车,输入的回车会作为下次循环的输入,看起来像没读入
        //解决方法:在scanf后写getchar函数,接收回车        
        q->next = p;
        p->next = NULL;
        q = p;            
    }
    printf("链表创建成功!\n");
    return true;
}
//链表遍历函数
Status TraverseList(LinkList L){
    LinkList p = NULL;
    p = L->next;
    //2016.4.12遍历时第一个元素为空,丢掉了最后一个元素,因为头结点不含有效值
    //所以要将遍历的起点设在第一元素结点处:L->next
    if (!p){
        return false;
    }
    while (p)//注意这里的判断条件是p,不是p->next
    {
        printf("链表中的元素:");
        printf("%c", p->data);
        printf("\n");
        p = p->next;
    }
    return true;
}
int GetLength(LinkList L){
    LinkList p=L->next;//注意这里的起点仍为首元结点,因此返回的链表长度是除去头结点的
    int count=0;
    while (p){
        count++;
        p = p->next;
        
    }
    return count;
}
//判断链表是否为空
Status IsEmpty(LinkList L){
    if (L->next == NULL){
        return true;
    }
    return false;
}
//在第target个元素前插入一个元素
Status InsertList(LinkList &L, int target, Elemtype e){
   
    LinkList p=L;//这里起点是头结点,因为可能插在第一个元素之前
    LinkList s = NULL;
    int i = 0;
    while (p&&i < target-1){   //不太懂这里的条件
        p = p->next;
        ++i;
    }     
    if (!p||target>i-1){//判断非法位置
        return false;
      }
    
    s = (LinkList)malloc(sizeof(Lnode));
    s->data = e;
    s->next = p->next;
    p->next = s;
    return true;
}
//删除第target个元素
Status DeleteList(LinkList &L, int target, Elemtype &e){
    int i=0;
    LinkList p = L;
    LinkList q = NULL;
    while (p->next&&i < target - 1){
        p = p->next;
        i++;
    }
    if (!(p->next) || i>target - 1){
        return false;
    }
    q = p->next;
    p->next = q->next;
    e = q->data;
    free(q);
    
}

 

posted @ 2016-04-12 23:34  姜姜csu  阅读(779)  评论(0编辑  收藏  举报