1. 程式人生 > >連結串列的幾種操作

連結串列的幾種操作

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct student
{
int id;
struct student* next;
}STU;
//建立頭節點
STU* createchain()
{
//頭節點
STU* head=NULL;
head = (STU*)malloc(sizeof(STU));
head->id = 0;
head->next = NULL;
return head;
}
//銷燬連結串列
void freechain(STU* head)
{
STU* tmp = head;
STU* pnext;
while (tmp)
{
pnext = tmp->next;
free(tmp);
tmp = pnext;
}
}
//插入節點,尾插法
void insertnode(STU* head, STU data)
{
STU* tmp=head;
while (tmp->next)//求出連結串列尾節點
{
tmp = tmp->next;
}
tmp->next = (STU*)malloc(sizeof(STU));
tmp->next->id = data.id;
tmp->next->next = NULL;
}
//刪除指定節點
void deletenode(STU* head, STU data)
{
STU* prev=head;
STU* tmp=head->next;
STU* next;
int flag = 0;
while (tmp->next) 
{
if (tmp->id == data.id)
{
flag = 1;
break;
}
prev = prev->next;
tmp = tmp->next;
}
if (flag)
{
if (!tmp->next)//判斷是不是最後一個節點
{
prev->next = NULL;
free(tmp);
}
else
{
next= tmp->next;
prev->next = next;
free(tmp);
}
}
else
{
//指定的資料不存在
return;
}
}
//獲取連結串列長度
int countlen(STU* head)
{
int len = 0;
STU* tmp = head->next;
while (tmp)
{
len++;
tmp = tmp->next;////////////////////
}
return len;
}
//遍歷連結串列
void foreach(STU* head)
{
STU* tmp=head->next;
if (tmp == NULL)
{
printf("chain has no content\n");
return;
}
while (tmp)
{
printf("tmp->id=%3d\n", tmp->id);
tmp = tmp->next;
}
}
//連結串列逆序
STU* reversal(STU* head)
{
STU* thead = head;
STU* prev=head->next;
STU* tmp = prev->next;////////////////////////////
STU* pnext=tmp->next;
STU* firstnode = head->next;
while (pnext)
{
tmp->next = prev;
prev = tmp;
tmp = pnext;
pnext = pnext->next;
}
tmp->next = prev;
thead->next = tmp;


firstnode->next = NULL;
return thead;
}
//按順序插入
void insertbyid(STU* head,STU data)
{
STU* tmp;
STU* pnext=NULL;
tmp = head->next;
int flag = 0;
int F;
if (countlen(head) < 1)
{
F = 0;
}
else
{
F = 1;
pnext = tmp->next;
}
while (pnext && F)
{
if (tmp->id <= data.id && pnext->id >= data.id)
{
flag = 1;
STU* insertnode = (STU*)malloc(sizeof(STU));
insertnode->id = data.id;
tmp->next = insertnode;
insertnode->next = pnext;
break;
}
tmp = tmp->next;
pnext = pnext->next;
}
if (!flag)
{
STU* insertnode = (STU*)malloc(sizeof(STU));
insertnode->id = data.id;
insertnode->next = NULL;
if(!F)
{
head->next = insertnode;
}
else
{
tmp->next = insertnode;
}
}
}
//連結串列排序
STU* chainsort(STU* head)
{

int len = countlen(head);
if (len <= 1)
return NULL;
STU* tmp=head->next;
STU* rehead = (STU*)malloc(sizeof(STU));
rehead->next = NULL;
while (tmp)
{
insertbyid(rehead, *(tmp));
tmp = tmp->next;
}
freechain(head);
printf("after sort chain len =%d\n", countlen(rehead));
return rehead;
}
//
//
int main()
{
//建立頭節點
STU* head = createchain();
//插入資料
STU S1, S2, S3, S4, S5, S6, S7, S8;
S1.id = 1;S2.id = 2;S3.id = 3;S4.id = 4;
S5.id = 8;S6.id = 7;S7.id = 6;S8.id = 5;
insertnode(head, S1);insertnode(head, S2);
insertnode(head, S3);insertnode(head, S4);
insertnode(head, S5);insertnode(head, S6);
insertnode(head, S7);insertnode(head, S8);
//求連結串列節點數
printf("count chain node:%d\n", countlen(head));
//列印連結串列
foreach(head);
//刪除節點
deletenode(head, S3);
//列印連結串列
printf("--------------------------------------------------------\n");
foreach(head);
//求連結串列節點數
printf("count chain node:%d\n", countlen(head));
//連結串列排序
STU* sequence = chainsort(head);
//列印連結串列
foreach(sequence);
//連結串列逆序
STU* reverse_chain = reversal(sequence);
//列印連結串列
printf("after reverse\n");
foreach(reverse_chain);
//銷燬連結串列
freechain(reverse_chain);
system("pause");
return 0;
}

相關推薦

連結串列操作

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct student {int id;struct student* ne

連結串列去重操作-兩方法的實現

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

程序的操作c++版

 // JinCheng.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream> #include "stdlib.h

C 有頭結點連結串列的若干操作

比無頭節點的要簡單很多 文章目錄 建立 輸出 訪問第i個元素 在i個位置前插入 刪除第i個元素 頭插 逆置 尾插 排序 兩個有序連結串列合併在一起,合併在一起的連結串列也要有序 找出連結串列中資料最大的節點

Lucene筆記08-Directory的操作方式

一、IndexReader的刪除操作 IndexReader也可以執行刪除操作,使用IndexReader執行的刪除操作不需要重新獲取IndexReader物件了。使用IndexReader刪除的前提是,在建立IndexReader物件的時候,要設定它的readonly為false。 i

C語言_雙向迴圈連結串列的基本操作

目錄: 1、初始化 2、頭部插入 3、頭部刪除 4、尾部插入 5、尾部刪除 6、列印連結串列 7、任意位置插入 8、查詢值為data的節點 9、指定位置刪除 10、銷燬連結串列 ###1、初始化: 建立一個節點,給節點賦值為0;因為是迴圈連結串列,所以讓它的_pNext

js 跳轉連結方式

1、跳轉連結 在當前視窗開啟 window.location.href="http://www.baidu.com" 等價於 <a href="baidu.com" target="_self">go baidu</a>

資料結構(c語言)——雙向連結串列的基本操作

定義一個雙向連結串列結構: typedef struct DulNode{ // *prior:前一個元素的地址 // *next:後一個元素的地址 struct DulNode *prior; Element data; struct DulNode *

Restful的GET、POST、PUT、DELETED、PATCH操作

HTTP Method 與 CURD 資料處理操作對應 HTTP方法 資料處理 說明 POST Create 新增一個沒有id的資源 GET Read

C語言資料結構——雙迴圈連結串列的插入操作順序

雙向連結串列與單鏈表的插入操作的區別 雙向連結串列因為存在前驅指標和後繼指標所以需要修改的指標多於單鏈表,但指標改動的順序同樣重要 單鏈表的插入 eg:在節點p的後面插入指標s s->next=p->next;//首先要使要插入的指標指向p->next p->next=s

C++_連結串列的基本操作

/* * 連結串列相對於陣列: * 插入和刪除的效率高; * 查詢效率低; * 儲存額外的節點指標,帶來空間上的消耗; */ #include <iostream> using namespace std; //定義連結串列的資料結構 struct ListNode{

1326 Problem A 演算法2-8~2-11:連結串列的基本操作

問題 A: 演算法2-8~2-11:連結串列的基本操作 時間限制: 1 Sec  記憶體限制: 32 MB 提交: 136  解決: 68 [提交][狀態][討論版][命題人:外部匯入] 題目描述 連結串列是

遞迴實現連結串列的一些操作

遞迴作為一種重要的演算法思想,在連結串列中也有特別大的作用,特別是逆序輸出時,程式碼更加簡單。 以一個題為例: 設head指向一個非空單向連結串列: 1.輸出連結串列所有結點的值 2.逆向輸出所有結點的值 3.返回連結串列所有結點的和 4.返回連結串列奇數的個數 5.返回資料為

java 連結串列的常見操作

1.定義連結串列的節點類 class Node { protected Node next; // 下一節點 protected String data;// 資料 public Node(String data) { this.data = data; } // 顯示

Leetcode---相交連結串列--兩解法

相交連結串列 題目地址:相交連結串列 解法一 利用set集合儲存a連結串列的地址,再遍歷b連結串列每個節點,碰到相等的 就返回 public ListNode getIntersectionNode(ListNode headA, ListNode headB) {

單向迴圈連結串列的基本操作

‘’’ 說明:連結串列的本質是列表 連結串列的簡單操作: 基礎方法: is_empty()—判斷是否為空 length()—測量長度 travel()—遍歷連結串列 增: add()—頭部插入 1append()—尾部插入 insert()—中間某個位置插入 刪

雙向迴圈帶頭連結串列的基礎操作(增刪改查)

1.定義連結串列結點的結構 typedef int CLDataType; //結點型別 typedef struct ListNode { CLDataType _data; struct ListNode* _next; struc

小白的資料結構程式碼實戰(2)----雙向連結串列的各種操作

//Author:張佳琪 #include <stdio.h> #include <stdlib.h> typedef int ElemType; typedef struct Node { ElemType data; struct

雙向連結串列的基本操作

雙向連結串列與單鏈表的最大區別就是可逆。 插入(頭插) 刪除 具體程式碼如下: DeLink.h typedef int ELEM_TYPE; typedef struct DNode { ELEM_TYPE data; struct DNode* n

資料結構(c語言)--雙向連結串列的基本操作

定義一個雙向連結串列結構: typedef struct DulNode{ // *prior:前一個元素的地址 // *next:後一個元素的地址 struct DulNode *prior; Element data; struc