7-4 單鏈表基本操作
請編寫程序實現單鏈表插入、刪除結點等基本算法。給定一個單鏈表和一系列插入、刪除結點的操作序列,輸出實施上述操作后的鏈表。單鏈表數據域值為整數。
輸入格式:
輸入第1行為1個正整數n,表示當前單鏈表長度;第2行為n個空格間隔的整數,為該鏈表n個元素的數據域值。第3行為1個正整數m,表示對該鏈表施加的操作數量;接下來m行,每行表示一個操作,為2個或3個整數,格式為0 k d或1 k。0 k d表示在鏈表第k個結點后插入一個數據域值為d的結點,若k=0則表示表頭插入。1 k表示刪除鏈表中第k個結點,此時k不能為0。注:操作序列中若含有不合法的操作(如在長度為5的鏈表中刪除第8個結點、刪除第0個結點等),則忽略該操作。n和m不超過100000。
輸出格式:
輸出為一行整數,表示實施上述m個操作后的鏈表,每個整數后一個空格。輸入數據保證結果鏈表不空。
輸入樣例:
5
1 2 3 4 5
5
0 2 8
0 9 6
0 0 7
1 0
1 6
輸出樣例:
7 1 2 8 3 5
參照課本的實現
#include<iostream>
#include<iomanip>
#include<stdlib.h>
using namespace std;
typedef int ElemType;
typedef int Status;
#define ERROR 0
#define OK 1
#define OVERFLOW 3
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode ,*LinkList;
Status ListInsert(LinkList L,int i,ElemType e)
{
int j=0;
LinkList p=L,s;
while(p&&j<i-1) // 尋找第i-1個結點
{
p=p->next;
j++;
}
if(!p||j>i-1) // i小於1或者大於表長
return ERROR;
s=(LinkList)malloc(sizeof(LNode)); // 生成新結點
s->data=e; // 插入L中
s->next=p->next;
p->next=s;
return OK;
}
Status ListDelete(LinkList L,int i)
{
int j=0;
LinkList p=L,q;
while(p->next&&j<i-1) // 尋找第i個結點,並令p指向其前趨
{
p=p->next;
j++;
}
if(!p->next||j>i-1) // 刪除位置不合理
return ERROR;
q=p->next; // 刪除並釋放結點
p->next=q->next;
free(q);
return OK;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
LinkList L;
L=(LinkList)malloc(sizeof(LNode)); // 產生頭結點,並使L指向此頭結點
if(!L) // 存儲分配失敗
exit(OVERFLOW);
L->next=NULL;
int n=0,m=0;
LinkList db=L,da;
cin>>n;
for(int i=0;i<n;i++)
{
da=(LinkList)malloc(sizeof(LNode));
cin>>da->data;
da->next=NULL;
db->next=da;
db = da;
}
cin>>m;
for(int i=0;i<m;i++)
{
int o,x,y;
cin>>o;
if(o==0)
{
cin>>x>>y;
ListInsert(L,x+1,y);
}
else if(o==1)
{
cin>>x;
ListDelete(L,x);
}
else
{
exit(ERROR);
}
}
LinkList p=L->next;
while(p!=NULL)
{
cout<<p->data<<" ";
p = p->next;
}
return 0;
}