实现单链表的基本运算:初始化、插入、删除、求表的长度、判空、释放。
(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>
#include<iostream>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
using namespace std;
typedef int Status;
typedef char ElemType;//假设线性表中的元素均为整型
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LNode,*LinkList;
Status InitList(LinkList &L)
{
L=(LNode*)malloc(sizeof(LNode));
if(L==NULL)
return OVERFLOW;
L->next=NULL;
return OK;
}
/*Status CreateList(LinkList &L,int n)
{
while (n--) {
LNode *Last = NULL;
Last = L;
while (Last->next != NULL) {
Last = Last->next;
}
LNode *Temp = (LNode *) malloc(sizeof(LNode));
if (Temp == NULL)
return OVERFLOW;
cin >> Temp->data;
Temp->next = NULL;
Last->next = Temp;
}
return OK;
}*/
void ListPrint(LinkList &L)
{
LNode *p=L->next; //p指向第一个元素结点
while(p!=NULL)
{
if(p->next!=NULL)
cout<<p->data<<" ";
else
cout<<p->data;
p=p->next;
}
cout<<endl;
}
int GetLength(LinkList &L)
{
LNode *Last;
int num=0;
Last=L->next;
while(Last)
{
num++;
Last=Last->next;
}
return num;
}
void isNULL(LinkList &L)
{
if(L->next==NULL)
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}
Status CreateList(LinkList &L,int n)
{
LNode *Last;
Last = L;
while (Last->next) { //找到链表最后一个结点
Last = Last->next;
}
while (n--) {
LNode *Temp;
Temp = (LNode *) malloc(sizeof(LNode));
if (Temp == NULL)
return OVERFLOW;
cin>>Temp->data;//输入新节点的数据域
Last->next = Temp;//新的结点插到链尾
Temp->next=NULL;
Last=Last->next;//让Last走到链尾
}
return OK;
}
void putListElem(LinkList &L)
{
int num=1;
LNode *p=(LNode*)malloc(sizeof(LNode));
p=L->next;
while(p!=NULL)
{
if(num==3)
{
cout<<(p->data)<<endl;
break;
}
p=p->next;
num++;
}
}
int putListpos(LinkList &L,char a)
{
int pos=0;
LNode *p=L->next;
while(p!=NULL)
{
pos++;
if((p->data)==a)
return pos;
p=p->next;
}
return pos;
}
void InsertListElem(LinkList &L,char c)
{
int pos=0;
LNode *p=L->next,*q;
LNode *t=(LNode*)malloc(sizeof(LNode));
while(p)
{
pos++;
if(pos==3)
{
t->data=c;
t->next=p->next;
p->next=t;
break;
}
p=p->next;
}
}
void DelListElem(LinkList &L,int a)
{
int i=0;
LNode *p,*q;
p=L;
//q=(LNode*)malloc(sizeof(LNode));
while((p->next)&&i<a-1)
{
p=p->next;
++i;
}
/*if(!(p->next)||(i>a-1))
return OVERFLOW;*/
q=p->next;
p->next=q->next;
free(q);
}
void FreeList(LinkList &L)
{
LNode *p,*q;
p=L->next;
while(p)
{
q=p;
p=p->next;
free(q);
}
}
int main()
{
int number;
LinkList L;
InitList(L);
cout<<L->next<<endl;
scanf("%d",&number);
CreateList(L,number);
ListPrint(L);
cout<<GetLength(L)<<endl;
isNULL(L);
putListElem(L);
cout<<putListpos(L,'a')<<endl;
InsertListElem(L,'x');
ListPrint(L);
DelListElem(L,3);
ListPrint(L);
FreeList(L);
return 0;
}