1. 程式人生 > >c語言單鏈表的基本操作(程式碼)

c語言單鏈表的基本操作(程式碼)

c語言實現單鏈表的基本操作:建立、列印、刪除、插入、逆序。僅供學習之用還需不斷完善,有待讀者自己研究

#include <stdio.h>
#include <stdlib.h>


typedef struct stu
{
	int data; //資料
	struct stu *next; //指向下一節點的指標
}node;

node *creat(int n)//建立連結串列
{
    node *head,*p1,*p2;
    int i;
    head=p1=p2=(node *)malloc(sizeof(node));//建立節點
    for(i=0;i<n;i++)//利用for語句實現節點數目限制
    {
        if(p2->next!=NULL)
        {
			scanf("%d",&p1->data);
			p2->next=p1;//p2->next儲存p1,p2指向最後一個節點
			p2=p1;
			p1=(node *)malloc(sizeof(node));//建立下一個節點
        }
    }
    p2->next=NULL;
    return head;
}

void print(node *head)//列印連結串列
{
    node *p=head;
    while(p!=NULL)//節點不為空
    {
        printf("%d\n",p->data);//輸出節點
        p=p->next;//指向下一個節點
    }
}

node *search(node *head,int data)//查詢資料
{
    node *p=head;
    for(;p!=NULL;p=p->next)//遍歷整個連結串列
    {
        if(data==p->data)//對比資料
        printf("%3d,%3d\n",p,p->data);//輸出地址和資料
    }
}

node *insert(node *head,int n)//節點插入
{
	int n_1=1;
	node *p1=head,*p2;
	node *s=(node *)malloc(sizeof(node));//建立新節點
	printf("輸入插入的資料:");
	scanf("%d",&s->data);
	while(n_1!=n)//對比節點
	{
		p2=p1;//p2儲存p1位置
		p1=p1->next;//p1後移
		n_1++;//節點計數
	}
	if(n_1==n)
	{
		if(head==p1)//表頭
		{
            s->next=head;//修改head和新節點指標關係
            head=s;
		}
		else//表間
		{
            s->next=p1;//修改新節點和p1,p2的指標關係
            p2->next=s;
		}
	}
	return head;
}

/*node *insert(node *head,int data)
{
	node *p1=head,*p2;
	node *s=(node *)malloc(sizeof(node));//建立新節點
	printf("輸入插入的資料:");
	scanf("%d",&s->data);
	while(p1->data!=data)//對比資料域
	{
		p2=p1;//p2儲存p1位置
		p1=p1->next;//p1後移
	}
	if(p1->data=data)
	{
		if(head==p1)//表頭
		{
            s->next=head;//修改head和新節點指標關係
            head=s;
		}
		else//表間
		{
            s->next=p1;//修改新節點和p1,p2的指標關係
            p2->next=s;
		}

	}
	return head;
}*/

node *del(node *head,int n)//刪除節點
{
    int n_1=1;
    node *p1=head,*p2=NULL;
    while(n_1!=n)//對比節點
	{
		p2=p1;//p2儲存p1的位置
		p1=p1->next;//p1後移
		n_1++;//節點計數
	}
	if(n_1==n)
	{
		if(p1==head)//表頭
		{
			head=p1->next;//head指向第二個節點,孤立表頭
			free(p1);//釋放孤立出來的節點(即從記憶體中刪除)
		}
		else
		{
            p2->next=p1->next;//孤立出要刪除的節點
            free(p1);//釋放孤立出的節點(即要刪除的節點)
		}
	}
	return head;
}

/*node *del(node *head,int data)
{
    node *p1=head,*p2;
    while(p1->data!=data)//對比資料域
	{
		p2=p1;//p2儲存p1位置
		p1=p1->next;//p1後移
	}
	if(p1->data==data)
	{
		if(p1==head)//表頭
		{
			head=p1->next;//head指向第二個節點,孤立表頭
			free(p1);//釋放孤立出來的節點(即從記憶體中刪除)
		}
		else
		{
            p2->next=p1->next;//孤立出要刪除的節點
            free(p1);//釋放孤立出的節點(即要刪除的節點)
		}
	}
	return head;
}*/

void del_a(node *head)//刪除連結串列
{
    node *tmp,*p=head;
    while(p!=NULL)
    {
        tmp=p;//tmp儲存d位置
        p=p->next;//p指向下一個節點
        free(tmp);//釋放節點
    }
    head=NULL;
}

node *reverse(node *head)//逆序連結串列
{
    node *p1,*p2,*p3;
    if(head==NULL||head->next==NULL)
    return head;
    p2=head;//指向第一個節點
    p1=head->next;//指向第二個節點
    head->next=NULL;//第一個節點後繼置空
    while(p1!=NULL)
    {
        p3=p2;//p3指向p2位置
        p2=p1;//p2指向p1位置
        p1=p1->next;//p1指向下一個節點
        p2->next=p3;//逆序節點
    }
    head=p2;//頭指標指向逆序後的第一個節點
    return head;
}

/*node *reverse(node *head)
{
	node *p1,*p2,*p3;
	if(head == NULL || head->next == NULL)
    return head;

	p1=head;//指向第一個節點
	p2=head->next;//指向第二個節點
	head->next=NULL;
	while(p2!=NULL)
	{
		p3=p2->next;//將下一個節點儲存下來
		p2->next=p1;//將當前節點的下一節點置為前節點
		p1=p2;//將當前節點儲存為前一節點
		p2=p3;//將當前節點置為下一節點
	}
	head=p1;
	return head;
}*/

int main()
{
    int n,n1,n2;
    node *p,*p2;
    FILE *fp;
    fp=fopen("file.txt","w+");
    while(1)
    {
        printf("1 建立一個連結串列\n2 插入一個節點\n3 刪除一個節點\n4 儲存到文字file.txt\n5 刪除整個連結串列\n6 查詢資料\n7 逆序連結串列\n8 列印連結串列\n");
        scanf("%d",&n);
        switch(n)
        {
		case 1:
            printf("輸入五個節點資訊:\n");
            p=creat(5);
            printf("\n");
            print(p);
            break;
		case 2:
            printf("在那個節點之前插入:");
            scanf("%d",&n1);
            p=insert(p,n1);
            printf("\n");
            print(p);
            break;
		case 3:
            printf("刪除那個節點:");
            scanf("%d",&n1);
            p=del(p,n1);
            printf("\n");
            print(p);
            break;
        case 4:
            printf("儲存到文字file.txt\n");
            p2=p;
            for(;p2!=NULL;p2=p2->next)
            fprintf(fp,"%5d",p2->data);
            fclose(fp);
            break;
		case 5:
            printf("刪除整個連結串列\n");
            del_a(p);
            break;
        case 6:
            printf("查詢的資料:");
            scanf("%d",&n2);
            search(p,n2);
            break;
        case 7:
            printf("逆序連結串列\n");
            p=reverse(p);
            print(p);
            break;
        case 8:
            printf("輸出連結串列\n");
            print(p);
            break;

        }
    }

}


相關推薦

c++實現單鏈基本操作

程式媛決定好好學習寫程式碼 連結串列是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中的指標連結次序實現的。連結串列由一系列結點(連結串列中每一個元素稱為結點)組成,結點可以在執行時動態生成。每個結點包括兩個部分:一個是儲存資料元素的資料域,

c語言單鏈基本操作(程式碼)

c語言實現單鏈表的基本操作:建立、列印、刪除、插入、逆序。僅供學習之用還需不斷完善,有待讀者自己研究 #include <stdio.h> #include <stdlib.h> typedef struct stu { int data; /

C語言單鏈基本操作總結

刷LeedCode時使用單鏈表頻出錯誤,於是花時間總結了一下單鏈表的基本操作,把所寫程式碼和詳細註釋貼在這裡,以備後用。 #include <stdio.h> #include <stdlib.h> /*定義結構體連結串列節點: 該結構體有兩個屬性,一個是int型

C語言單鏈基本操作的實現

        資料結構中,單向連結串列(又名單鏈表、線性連結串列)是連結串列的一種,其特點是連結串列的連結方向是單向的,對連結串列的訪問要通過從頭部開始,依序往下讀取。         下面的程式碼是使用指標實現的

c語言單鏈基本操作

連結串列 是一種動態儲存方式,和順序表相比,連結串列物理儲存上是非連續的,而且採用動態記憶體開闢,其優點是方便插入,沒有上限的儲存,不需要記憶體空間的重組,能有效的分配和利用記憶體資源,不會造成空間浪費,缺點是排序很麻煩,查詢也很麻煩,而且需要多個指標操作,容

單鏈基本操作C語言實現(鏈式儲存結構)

#include<stdio.h> #include<stdlib.h> typedef int DataType; typedef struct Node{ DataType data; struct Node *next; }

資料結構(c語言)——線性單鏈基本操作

#include <stdio.h> #include <stdlib.h> typedef int Element; typedef char(*Status)[10]; #define ERROR "error" #define OK "ok"

《資料結構與演算法》-單鏈基本操作C語言實現

最近在學演算法內容,發現很多演算法依賴於基本的資料結構,所以從新溫習資料結構,記錄一下,以後知識點忘記可以提醒自己哪裡比較容易出錯。 所用教材《資料結構與演算法分析》by Mark Allen Weiss 《資料結構》(C語言

C語言-單鏈基本操作-嚴蔚敏版的資料結構

以下部分是標頭檔案 #ifndef __LianBiao__ #define __LianBiao__ typedef int ElemType; typedef struct LNode { int data; struct LNode

第一篇部落格—c語言單鏈基本操作

c語言單鏈表的基本操作 對於c語言的初學者來說,連結串列是一塊大難點,其中用到結構體,指標的知識,這裡講的是最簡單的單鏈表,連結串列是一種動態儲存方式,和陣列相比,連結串列的優點是方便插入,沒有上限的儲存(相對來說),缺點也很明顯,排序很煩,查詢也很麻煩。

C 資料結構中單鏈基本操作

C中的typedef C中的typedef關鍵字作用是為一種資料型別定義一個新名字,這樣做的目的有兩個,一是給變數定義一個易記且意義明確的新名字,如: typedef unsigned char BYTE; 把unsigned char型別自命名為BYTE。另一個目的是

c++學習筆記—單鏈基本操作的實現

用c++語言實現的單鏈表基本操作,包括單鏈表的建立(包括頭插法和尾插法建表)、結點的查詢、刪除、排序、列印輸出、逆置、連結串列銷燬等基本操作。 IDE:vs2013 具體實現程式碼如下: #include "stdafx.h" #include <malloc.h

C++ 單鏈表基本操作分析與實現 連結串列   連結串列是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中的指標連結次序實現的。連結串列由一系列結點(連結串列中每一個元素稱為結點)組成,結

連結串列   連結串列是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中的指標連結次序實現的。連結串列由一系列結點(連結串列中每一個元素稱為結點)組成,結點可以在執行時動態生成。每個結點包括兩個部分:一個是儲存資料元素的資料域,另一個是儲存下一個結點地址的指標域。 相比於線性表

C語言單鏈(線性的鏈式儲存)實現程式碼

linklist.h  //標頭檔案:資料 及 函式的宣告#ifndef __LINKLIST_H__ #define __LINKLIST_H__ #include <stdio.h> #include <stdlib.h> typedef in

c語言-單鏈(一)

printf blog 定義 單鏈表 mage 操作 img 生成 return 定義節點: typedef struct Node { int data; Node* pNext; }NODE, *PNODE; 細節說明,PNode 就代表str

C語言——單鏈——學生管理系統

鞏固了一下單鏈表的知識點,並運用單鏈表寫了個簡單的學生管理系統 實現功能:增、刪、改、查 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #includ

單鏈 基本操作(元素遞增排序)

題目描述: 有一個帶頭節點的單鏈表L(至少有一個數據節點),設計一個演算法使其元素遞增有序排列。 解題思路: 由於單鏈表L中有一個以上的資料節點,首先構造一個只含有頭結點和首節點的有序單鏈表(只含有一個數據節點的單鏈表一定是有序的),然後掃描單鏈表L餘下的節點(由P指向),在有序單鏈表中

單鏈基本操作(刪除連結串列中最大元素)

題目描述: 設計一個演算法,刪除一個單鏈表L中元素值最大的節點(假設這樣的節點唯一) 解題思路: 在單鏈表中刪除一個節點先要找到它的前驅節點,用指標p掃描整個單鏈表,pre指向節點p的前驅節點,在掃描時用maxp指向data域值最大的節點,maxpre指向maxp所指節點的前驅節點,當連

單鏈 簡單題(單鏈基本操作

題目描述: 有一個帶頭結點的單鏈表L=(a1,b1,a2,b2,......an,bn),設計一個演算法將其拆分成兩個帶頭結點的單鏈表L1和L2,其中L1=(a1,a2,a3...an),L2=(b1,b2,b3....bn),要求L1使用L的頭結點。 解題思路: 利用原單鏈表L中的所有

C語言單鏈

  學過線性表中的順序表的都知道,順序表裡的資料在實體記憶體上是相鄰的,所以當我們在順序表中想要訪問下一個元素時可以直接去訪問,就像陣列一樣。但是單鏈表卻不同,單鏈表的資料儲存的位置是動態分配的,也就是說單鏈表的儲存在實體記憶體上不是相鄰的,所以我們就只能通過指標這種方式來把單鏈表串起來,