單鏈表的簡單實現

#include<stdlib.h>java

#include<stdio.h>node

//定義數組的大小爲100數組

//頭結點:有時,在鏈表的第一個結點以前會額外增設一個結點,this

//結點的數據域通常不存放數據(有些狀況下也能夠存放鏈表的長指針

//度等信息),此結點被稱爲頭結點。code

//若頭結點的指針域爲空(NULL),代表鏈表是空表。頭結點對於鏈表來講索引

//,不是必須的,在處理某些問題時,給鏈表添加頭結點會使問題變得簡單。內存

//頭指針:永遠指向鏈表中第一個結點的位置(element

//若是鏈表有頭結點,頭指針指向頭結點;不然,頭指針指向首元結點)。get

typedef int elementType;

typedef struct Lnode{

//存儲的數據

elementType data;

//存儲下一個指針

struct Lnode *next;

}LinkList;

LinkList* init(LinkList *head){

head = (LinkList *)malloc(sizeof(LinkList));

if(head==NULL)

 {
 	printf("內存沒啦");
	
 	return NULL; 
 }
 
 head->next=NULL;
 
 printf("初始化成功\n");
 
 return head;

}

void insert(LinkList *head,elementType x,int i){

if(i<0){

	printf("插入的位置不能爲負數\n");
	
	return;
}

int j=-1;

LinkList *p,*s;
p=head;

while(p->next!=NULL&&j<i-1){

	p=p->next;
	
	j++;
}

if(j!=i-1)
{
	printf("插入位置有誤\n");
	
	return ;
}

 s = (LinkList *)malloc(sizeof(LinkList)); 
 
 if(s==NULL){
 
 	printf("內存沒了");
	
 	return;
 } 
 s->data=x;
 
 s->next = p->next;
 
 p->next=s;
 
 
 printf("插入成功\n");

}

//根據索引取值 ,咱們沒有判斷索引的位置是否有問題

int getItem(LinkList *head,int i){

LinkList *p=head;

int j=-1;

while(p->next!=NULL&&j<i){

	j++;
	
	p=p->next; 
	
}
//這個地方返回-1是一個bug 

if(j!=i)

return -1;

return p->data;

}

void delete1(LinkList *head,int i){

int j=-1;

LinkList *p,*s;

p=head;

while(p->next!=NULL&&j<i-1){

	p=p->next;
	
	j++;
  } 
  
  if(j!=i-1){
  
  		printf("刪除位置有誤\n");
		
  	return;

  }
  #此處判斷刪除的索引位置超過索引的最大值 
  
  if(p->next==NULL)
  {
  	printf("位置不存在\n");
	
  	return;
  }

s=p->next;

p->next=s->next;

free(s);

return;

}

int main(){

//建立一個空表

LinkList *head;

head = init(head);

for (int i=0;i<10;i++)

insert(head,i+1,i);

int x;

delete1(head,11);

for( int i=0;i<10;i++){

x= getItem(head,i);

printf("%d\n",x);

} }

java

public class Node {

//指針域

public Node next;

//數據域

public int data;


public Node(int data){


    this.data=data;
}

}

public class Link_list {

private Node head;

private Node current;

//給size的目的是,當判斷邊界的時候,不須要去求長度

private int size=0;

//初始化頭結點

public Link_list(){

    this.head=null;
}
//向鏈表中添加數據,都是經過尾部插入的

public void addHead(Link_list head,int data){

   //主要考慮兩種狀況,1 一個節點都沒有,2 有節點的狀況

   //建立一個新的節點
   
    Node temp = new Node(data);
	
    //新節點的next指向head.head
	
    temp.next = head.head;
	
    //head.head指向新建立的節點
	
    head.head=temp;
	
     size++;
	 
    System.out.println(temp.data);
	
}

public void add_index(Link_list head,int i,int x){

    if(i==0) {
	
        addHead(head,x);
		
        return;
    }
	
    //判斷插入索引的位置是否符合條件
	
    if(i<0||i>size)
    {
        System.out.println("插入的索引位置有誤");
		
        return;
    }
	
    //若是程插入進行到此步時,說明該鏈表有很多於一個點,因此j=1
	
    int j=1;
	
    Node p=head.head;
	
    ///找到索引i的位置
    while(p.next!=null&&j<i){
	
        j++;
		
        p=p.next;
    }

    Node s =new Node(x);
	
    s.next=p.next;
	
    p.next=s;
	
    size++;
	
    System.out.println(s.data);
	
}
//經過索引獲取值

public int getElement(Link_list head,int i)throws Exception{

    int j=0;
	
    //我所給的索引位置是從0開始,而我記錄的size也是從0開始的
	
    if(i<0||i>size)
	
      throw new IndexOutOfBoundsException("查找的索引位置出錯");

    Node p =head.head;
	
    while (p!=null&&j<i){
	
        p=p.next;
		
        j++;
    }
	
    if(j>i)
	
        throw new Exception("查找的索引位置出錯");
		
    return  p.data;

}

//經過索引刪除值

public void delete_list(Link_list head,int i) throws Exception{

    if(i<0||i>=size)
	
        throw new Exception("刪除索引位置出錯");
		
    int j=0;
	
    Node p = head.head;
	
    if(i==0) {
	
        head.head = p.next;
		
        return;
    }
	
    //找出刪除索引的前一個
	
    while (p.next!=null&&j<i-1){
	
        p=p.next;
		
        j++;
    }

    p.next=p.next.next;
}
public static void main(String[] args) throws Exception {

   Link_list list = new Link_list();
   
   list.add_index(list,0,110);
   
    list.add_index(list,0,111);
	
    list.add_index(list,2,123);
	
  list.delete_list(list,2  );
  
    System.out.println(list.getElement(list,0));
	
    System.out.println(list.getElement(list,1));
	
}

}

相關文章
相關標籤/搜索