在鏈表指定位置插入結點


問題描述 :

輸入若干(不超過100個)非負整數,創建一個不帶頭結點的單向鏈表。
再輸入一個位置index以及一個數據data,程序中首先創建一個新結點s,s的數據成員為data,然后調用函數insertNode將s插入到鏈表的指定位置index處,最后輸出結果鏈表。
請編寫insertNode函數,完成插入操作。insertNode函數的原型如下:


struct student *insertNode(struct student *head, struct student *s, int index)
形參:
struct student *head:鏈表的頭指針,需要插入到這個鏈表中
struct student *s:指向需要插入的結點
int index:插入位置。index從1開始編號。如果鏈表中已有n個結點,則index的有效范圍為 1<= index <= n+1。
返回值:
函數返回結果鏈表的頭指針

 

輸入說明 :

 首先輸入若干非負整數,每個整數作為數據放入一個鏈表結點中,輸入-1表示輸入結束。
然后輸入若干組整數,每組一行,每行包含兩個整數,第一個表示需要插入位置index,第二個為新結點的數據。如:輸入“1 5”表示在鏈表的第一個位置(最前面)插入一個結點,結點的數據為5。

輸出說明 :

對於每組輸入,輸出插入結點之后的結果鏈表。輸出的信息以head開頭,以tail結尾,以“-->”分隔。具體見輸出范例。
如果輸入的index超出了鏈表的范圍(如果鏈表中已有n個結點,則index的有效范圍為 1<= index <= n+1),則不插入,輸出原鏈表。如果是空鏈表,則直接輸出“head-->tail”。

輸入范例 :

1 2 3 -1
1 10
3 20

輸出范例 :

head-->10-->1-->2-->3-->tail
head-->10-->1-->20-->2-->3-->tail

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
struct student
{
    int  num;
    struct student* next;
};
//從鍵盤讀入數據創建鏈表,新結點插入到尾部
struct student* createByTail()
{
    struct student* head;
    struct student* p1, * p2;
    int n;
    n = 0;
    p1 = p2 = (struct student*)malloc(sizeof(struct student));
    scanf("%d", &p1->num);
    head = NULL;  //首先置鏈表為空鏈表
    while (p1->num != -1)    //num為-1,意味着用戶輸入結束
    {
        n = n + 1;
        if (n == 1)            //創建第一個結點
            head = p1;
        else
            p2->next = p1;
        p2 = p1;            //p2始終指向最后一個結點(即尾指針)
        p1 = (struct student*)malloc(sizeof(struct student)); //p1指向新結點
        scanf("%d", &p1->num);
    }
    p2->next = NULL;  //最后一個結點的next賦值為NULL
    return head;
}
//輸出鏈表中的信息(num)
void  displayLink(struct student* head)
{
    struct student* p;
    p = head;
    printf("head-->");
    while (p != NULL)
    {
        printf("%d-->", p->num);
        p = p->next;
    }
    printf("tail\n");
}
//在鏈表中第index處插入s指針所指向的結點。index從1開始。
//由於可能插在第一個結點,所以函數返回頭指針給主調函數
//head 是不帶頭結點的鏈表
struct student* insertNode(struct student* head, struct student* s, int index)
{
    if (!head && index != 1)return head;//處理空鏈表
    if (index == 1)//處理插在頭
    {
        s->next = head;
        return s;
    }
    else
    {
        struct student* p = head,*q;
        int i = 1;
        while (p->next)//正常插入
        {
            if (i == index - 1)
            {
                s->next = p->next;
                p->next = s;
                break;
            }
            i++;
            p = p->next;
        }
        if (!p->next&&i==index-1)//插入到尾
        {
            p->next = s;
            s->next = NULL;
        }
        return head;
    }
}
int main()
{
    struct student* head;
    int index, data;
    head = createByTail();
    while (scanf("%d%d", &index, &data) != -1)
    {
        struct student* s = (struct student*)malloc(sizeof(struct student));
        s->num = data;
        head = insertNode(head, s, index);
        displayLink(head);
    }
    return 0;
}

 


免責聲明!

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



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