#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)); }
}