jmu-ds-单链表的基本运算(15 分)
实现单链表的基本运算:初始化、插入、删除、求表的长度、判空、释放。
(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 ListCreate_L(LinkList &L,int n) { LNode *rearPtr,*curPtr; //一个尾指针,一个指向新节点的指针 L=(LNode*)malloc(sizeof (LNode)); if(!L)exit(OVERFLOW); L->next=NULL; //先建立一个带头结点的单链表 rearPtr=L; //初始时头结点为尾节点,rearPtr指向尾巴节点 for (int i=1; i<=n; i++) //每次循环都开辟一个新节点,并把新节点拼到尾节点后 { getchar(); curPtr=(LNode*)malloc(sizeof(LNode));//生成新结点 if(!curPtr)exit(OVERFLOW); scanf("%c",&curPtr->data); curPtr->next=NULL; //最后一个节点的next赋空 rearPtr->next=curPtr; rearPtr=curPtr; } return OK; } void ListPrint_L(LinkList &L) { LNode *p=L->next; //p指向第一个元素结点 while(p!=NULL) { if(p->next!=NULL) printf("%c ",p->data); else printf("%c\n",p->data); p=p->next; } } void ListLocate_L(LinkList &L,int n) { LNode *p; int counter=0; p=L->next; while(p!=NULL) { counter++; if(counter==n) { printf("%c\n",p->data); return ; } p=p->next; } } void ListFind_L (LinkList &L,char c) { LNode *p; int counter=0; p=L->next; while(p!=NULL) { counter++; if(p->data==c) { printf("%d\n",counter); return ; } p=p->next; }} void ListInsert_L(LinkList &L,int k,char c) { LNode *rearPtr,*curPtr,*p; curPtr=L->next; int counter=1; while(curPtr!=NULL) { if(counter==k) { p=(LNode*)malloc(sizeof(LNode)); p->data=c; p->next=rearPtr->next; rearPtr->next=p; } rearPtr=curPtr; curPtr=curPtr->next; counter++; } if(counter<k) { p=(LNode*)malloc(sizeof(LNode)); p->data=c; p->next=NULL; curPtr->next=p; } } void ListDelete_L(LinkList &L,int n) { LNode *rearPtr,*curPtr; int counter=0; rearPtr=L; curPtr=L->next; while(curPtr!=NULL) { counter++; if(counter==n) {rearPtr->next=curPtr->next; return; }rearPtr=curPtr; curPtr=curPtr->next; } } int main() { LinkList L; ListCreate_L(L,0); printf("%d\n",L->next); int n; scanf("%d",&n); if(ListCreate_L(L,n)!= OK) { printf("表创建失败!!!\n"); return -1; } ListPrint_L(L); printf("%d\n",n); if(L->next==NULL) { printf("yes\n"); } else printf("no\n"); ListLocate_L(L,3); ListFind_L(L,'a'); ListInsert_L(L,4,'x'); ListPrint_L(L); ListDelete_L(L,3); ListPrint_L(L); L->next=NULL; return 0; }