实现单链表的基本运算:初始化、插入、删除、求表的长度、判空、释放。
(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<stdio.h> #include<malloc.h> #include<stdlib.h> //函数状态码定义 #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);(在固定位置插入函数)这个代码,由于初学,代码的重用度很低,个人感觉还可以精简,后期会进行改进,若网友有更好的答案欢迎分享~