7-3 jmu-ds-单链表的基本运算

实现单链表的基本运算:初始化、插入、删除、求表的长度、判空、释放。
(1)初始化单链表L,输出L->next的值;
(2)依次采用尾插法插入元素:输入分两行数据,第一行是尾插法需要插入的字符数据的个数,第二行是具体插入的字符数据。
(3)输出单链表L;
(4)输出单链表L的长度;
(5)判断单链表L是否为空;
(6)输出单链表L的第3个元素;
(7)输出元素a的位置;
(8)在第4个元素位置上插入‘x’元素;
(9)输出单链表L;
(10)删除L的第3个元素;
(11)输出单链表L;
(12)释放单链表L。

输入格式:

两行数据,第一行是尾插法需要插入的字符数据的个数,第二行是具体插入的字符数据。

输出格式:

按照题目要求输出

输入样例:

5
a b c d e

输出样例:

0
a b c d e
5
no
c
1
a b c x d e
a b x d e

//库函数头文件包含
#include
#include
#include

//函数状态码定义
#define TRUE        1
#define FALSE       0
#define OK          1
#define ERROR       0
#define INFEASIBLE -1
#define OVERFLOW   -2

typedef int  Status;
typedef char ElemType;

//链表的定义
typedef struct LNode{
   ElemType data;
   struct LNode* next;
}LNode, *LinkList;

//链表的初始化
Status InitList_L(LinkList &L); //链表初始化
Status InsertList_L(LinkList &L, int x); //在尾部插入元素
Status InsertList_pos_L(LinkList &L, int pos, ElemType e); //在指定位置插入元素
Status PrintList_L(LinkList L); //输出链表
Status PrintLength_L(LinkList L); //输出表长
bool IfNull_L(LinkList L);//判断表是否为空
Status PrintList_num_L(LinkList L, int pos);//输出某位置元素
Status PrintList_pos_L(LinkList L, ElemType e);//输出某元素位置
Status DeleteList_pos_L(LinkList &L, int pos);//删除某元素

int main(){
   int x;
   scanf("%d",&x);
   LinkList L;
   InitList_L(L);
   InsertList_L(L, x);
   PrintList_L(L);
   PrintLength_L(L);
   if(IfNull_L(L))
       printf("yes\n");
   else
       printf("no\n");
   PrintList_num_L(L, 3);
   PrintList_pos_L(L, 'a');
   InsertList_pos_L(L, 4, 'x');
   PrintList_L(L);
   DeleteList_pos_L(L, 3);
   PrintList_L(L);
   free(L);
}

//链表的初始化
Status InitList_L(LinkList &L){
   L = (LNode*)malloc(sizeof(LNode));
   if(!L) exit(OVERFLOW);
   L->next = NULL;
   printf("%d\n", L->next);
   return OK;
}

//在尾部插入元素
Status InsertList_L(LinkList &L, int x){
   LinkList p, q;
   p = L;
   for(int i = 0; i < x; i++){
       q = (LNode*)malloc(sizeof(LNode));
       if(!q) exit(OVERFLOW);
       scanf("%s",&q->data);
       p->next = q;
       p = p->next;
   }
   p->next = NULL;
}

Status InsertList_pos_L(LinkList &L, int pos, ElemType e) //在指定位置插入元素
{
    LinkList p, q, curPtr;
    p = L;
    curPtr = (LNode*)malloc(sizeof(LNode));
    if(!curPtr) exit(OVERFLOW);
    curPtr->data = e;
    int i = 1;
    if(pos < 0) return ERROR;
    while(p->next != NULL){
        if(p->next == NULL&&pos > i){
            p->next = curPtr;
            curPtr->next = NULL;
        }
        if(pos == i){
            q = p->next;
            p->next = curPtr;
            curPtr->next = q;
        }
        p = p->next;
        i++;
    }
    return OK;
}

Status PrintList_L(LinkList L) //输出链表
{
    int i = 0;
    LNode* p = L->next;
    if(p->next == NULL) printf("NULL");
    while(p){
        if(i == 0) printf("%c", p->data);
        else printf(" %c", p->data);
        i++;
        p = p->next;
    }
    printf("\n");
    return OK;
}

Status PrintLength_L(LinkList L) //输出表长
{
    int length = 0;
    LinkList p = L->next;
    while(p){
        length++;
        p = p->next;
    }
    printf("%d\n", length);
    return OK;
}

bool IfNull_L(LinkList L)//判断表是否为空
{
    if(L == NULL) return true;
    else return false;
}

Status PrintList_num_L(LinkList L, int pos)//输出某位置元素
{
    int i = 1;
    LinkList p = L->next;
    while(p){
        if(i == pos){
           printf("%c\n", p->data);
           break;
        }
        p = p->next;
        i++;
    }
}

Status PrintList_pos_L(LinkList L, ElemType e)//输出某元素位置
{
    int i = 1;
    LinkList p = L->next;
    while(p){
        if(p->data == e){
            printf("%d\n", i);
            break;
        }
        i++;
        p = p->next;
    }
}

Status DeleteList_pos_L(LinkList &L, int pos)//删除某元素
{
    int i = 1;
    LinkList p, q;
    q = L;
    p = L->next;
    while(p){
        if(i == pos){
            q->next = p->next;
            free(p);
            break;
        }
        i++;
        q = q->next;
        p = p->next;
    }
}
  个人认为这次的题目是之前所学单链表的一个集合,主要的难点是Status InsertList_pos_L(LinkList &L, int pos, ElemType e);(在固定位置插入函数)这个代码,由于初学,代码的重用度很低,个人感觉还可以精简,后期会进行改进,若网友有更好的答案欢迎分享~

你可能感兴趣的:(C++)