PTA 7-4 單鏈表基本操作


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;
 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM