程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> c說話鏈表根本操作(帶有創立鏈表 刪除 打印 拔出)

c說話鏈表根本操作(帶有創立鏈表 刪除 打印 拔出)

編輯:關於C++

c說話鏈表根本操作(帶有創立鏈表 刪除 打印 拔出)。本站提示廣大學習愛好者:(c說話鏈表根本操作(帶有創立鏈表 刪除 打印 拔出))文章只能為提供參考,不一定能成為您想要的結果。以下是c說話鏈表根本操作(帶有創立鏈表 刪除 打印 拔出)正文



#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define LEN sizeof(struct Student)
struct Student
{
    long num;
    float score;
    struct Student*next;
};
int n;
int main()
{
    /*-----------------------------法式描寫--------------------------------------------
        標題:寫出一個主函數,分離挪用樹立鏈表的函數create(),輸入鏈表的函數print(),
              刪除鏈表結點的函數del(),拔出結點的函數insert(),一共5個函數。
        Author:KillerLegend
        Date:  2013.12.6
    ----------------------------------------------------------------------------------*/
//函數聲明
    struct Student* create();//創立靜態鏈表的函數聲明,函數類型為student構造體類型,前往頭指針
    struct Student* del(struct  Student* ,long);//刪除指定地位結點的函數聲明,參數:鏈表頭結點+刪除結點地位+前往頭指針
    struct Student* insert(struct Student*,struct Student*);//拔出一個Student類型數據的函數聲明
    void   print(struct Student*);//輸入鏈表中數據的函數聲明,參數為鏈表的頭指針
//界說變量
    struct Student *head,*stu;//界說靜態鏈表的頭指針與新的結點
    long del_num;
//樹立鏈表操作
    printf("Input records:\n");
    head = create();//樹立鏈表並前往頭指針
    print(head);//輸入全體結點

//刪除結點操作
    printf("\nInput the deleted number:");
    scanf("%ld",&del_num);
    while(del_num!=0)//當輸出學號為0時停止輪回
    {
        head = del(head,del_num);//刪除結點後前往鏈表的頭地址
        print(head);//輸入全體結點
        printf("Input the deleted number:");
        scanf("%ld",&del_num);
    }
//拔出結點操作
    printf("\nInput the inserted number:");
    stu=(struct Student*)malloc(LEN);//每拔出一個結點須要開拓一個新的結點
    scanf("%ld %f",&stu->num,&stu->score);
    while(stu->num!=0)//當輸出的學號為0時停止輪回
    {
        head = insert(head,stu);//前往鏈表的頭地址
        print(head);
        printf("\nInput the inserted number:");
        stu = (struct Student*)malloc(LEN);
        scanf("%ld %f",&stu->num,&stu->score);
    }
    return 0;
}
//樹立鏈表的函數
struct  Student* create()
{
    struct Student *head;
    struct Student *p1,*p2;
    n=0;
    p1=p2=(struct Student *)malloc(LEN);
    scanf("%ld %f",&p1->num,&p1->score);
    head=NULL;
    while(p1->num!=0)
    {
        n++;
        if(n==1)head=p1;
        else p2->next=p1;//第一次履行時,這一步是將頭指針指向本身,當n從2起,這一步用於使p2指向下一個元素
        p2=p1;//使p2和p1指向統一個存儲區
        p1=(struct Student*)malloc(LEN);//開拓靜態存儲區,強迫前往struct Student類型的指針
        scanf("%ld %f",&p1->num,&p1->score);
    }
    p2->next=NULL;
    return (head);
}

//刪除結點的函數
struct Student* del(struct  Student* head,long num)
{
    struct Student *p1,*p2;
    if(head==NULL)
    {
        printf("List null!\n");
        return (head);
    }
    p1=head;
    while(num!=p1->num && p1->next!=NULL)
    {
        p2=p1;
        p1=p1->next;
    }
    if(num==p1->num)
    {
        if(p1==head)
        {
            head=p1->next;
        }
        else
        {
            p2->next=p1->next;
        }
        printf("Delete:%ld\n",num);
        n=n-1;
    }
    else
    {
        printf("%ld not been found!",num);
    }
    return (head);
}

//拔出結點的函數
struct   Student* insert(struct Student* head,struct Student * stud)
{
    struct Student *p0,*p1,*p2;
    p1=head;
    p0=stud;
    if(head==NULL)//本來的鏈表是空表
    {
        head=p0;p0->next=NULL;//空表時使拔出的結點作為頭結點
    }
    else//假如不是空表,則遍歷尋覓適合的拔出地位
    {
        while((p0->num>p1->num)&&(p1->next!=NULL))//按學號次序拔出,假如拔出的學號數字比擬年夜,則應當向後推移
        {
            p2=p1;
            p1=p1->next;//後移
        }
    }
    if(p0->num<=p1->num)//找到拔出的地位,拔出的地位是p1所指向的地位之前,也就是p2指向的地位
    {
        if(head==p1)head=p0;//假如拔出的地位是頭地位之前,則使head指向p0
        else p2->next=p0;//假如不是頭地位之前,則使p2的next指針指向拔出的數據地址即p0
        p0->next=p1;//使p0的next指針指向p1,完成了數據的參加
    }
    else//拔出的學號地位在最初一個
    {
        p1->next=p0;
        p0->next=NULL;
    }
    n=n+1;//記載數加一
    return(head);
}
//輸入鏈表的函數
void print(struct Student * head)
{
    struct Student * p;
    printf("Now,These %d records are:\n",n);
    p=head;
    if(head!=NULL)
    do
    {
        printf("%ld %5.1f\n",p->num,p->score);
        p=p->next;
    }while(p!=NULL);
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved