/*
*鏈表的相關操作集合
*鏈表的創建 頭插法 尾插法
*鏈表元素的排序(遞增排序)
*鏈表的遍歷
*鏈表節點點的插入 前插 後插 在指點位置插入數據
*刪除指點位置的節點
*按值進行查找 按序號進行查找
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#define OK 1
#define ERROR 0
typedef char*NameType;//鏈表節點名稱的數據類型
//static int id=0;
typedef struct element
{
int id;
NameType name;//節點的名稱
}ElementType;//鏈表節點的數據域結構體
typedef struct linklist
{
ElementType data;
struct linklist *next;//指向下一個節點點的指針
}LinkList;//鏈表的數據類型
LinkList*create_linklist();//創建單鏈表
void Display_linklist(LinkList*head);//鏈表的遍歷
int insert_after_linklist(LinkList*p,LinkList*s);//在p後面插入s節點
int insert_before_linklist(LinkList*head,LinkList*p,LinkList*s);//在指定節點的前面進行插入
int insert_position(LinkList*head,int i,LinkList*p);//在指定的位置進行插入
void sort_node(LinkList*head);//對鏈表的節點進行排序
int delete_position(LinkList*head,int i );//刪除指定位置的節點
int delet_node(LinkList*head,LinkList*p);//刪除指點的節點
LinkList*search_index_linklis(LinkList*head,int i);//按序號進行查找
LinkList*search_data_linklist(LinkList*head,ElementType key);//按值進行查找
int length_linklist(LinkList*head);//返回鏈表的長度
int dele_node(LinkList*p);//對節點後繼節點進行刪除
void main()
{
LinkList*head;
LinkList*r;
LinkList*s;//在後面進行插入的節點
LinkList*s1;//在指定位置進行插入
int index;//要插入的位置
ElementType str;//要查詢的數據的名稱
head=create_linklist();
if(head==NULL)
printf("鏈表創建失敗!\n");
else
{
printf("鏈表創建成功!\n");
printf("鏈表遍歷的結果爲:\n");
Display_linklist(head);
}
printf("\n");
s=(LinkList*)malloc(sizeof(LinkList));//對其進行指向操作(同下)
s1=(LinkList*)malloc(sizeof(LinkList));//對其進行動態賦存儲空間
printf("請輸入要插入節點的數據:\n");
s->data.name=(NameType)malloc(sizeof(char)*20);
s->next=NULL;
scanf("%s",s->data.name);
s->data.id=rand()%50;
printf("輸入查詢的數據-名稱\n");
str.name=(NameType)malloc(sizeof(char)*20);
scanf("%s",str.name);
str.id=rand()%50;
r= search_data_linklist(head,str);
if(r==NULL)
{
printf("要查詢的數據沒有找到:\n");
}
else
{
//將節點s插入到查詢到的節點的後面
printf("查詢節點成功\n");
int result=insert_after_linklist(r,s);
if(result==0)
{
printf("插入節點失敗\n");
}
else
{
printf("插入節點成功\n");
}
}
s1=(LinkList*)malloc(sizeof(LinkList));
printf("請輸入要插入節點的名稱:\n");
s1->data.name=(NameType)malloc(sizeof(char)*20);
scanf("%s",s1->data.name);
s1->data.id=rand()%50;
printf("請輸入要插入的位置:\n");
scanf("%d",&index);
int result1= insert_position(head,index,s1);
if(result1==0)
{
printf("插入指定位置插入節點失敗\n");
}
else
{
printf("在指定位置插入節點成功\n");
}
printf("\n");
printf("對查詢到的節點進行刪除:\n");
int result2=delet_node(head,r);
if(result2==0)
{
printf("對指定節點的刪除失敗:\n");
}
else
{
printf("對指定節點的刪除成功:\n");
}
printf("請輸入要刪除的節點的位置:\n");
int index1;//要刪除的指定節點的下標
scanf("%d",&index1);
int result3=delete_position(head,index1);
if(result3==0)
{
printf("刪除指定位置節點失敗:\n");
}
else
{
printf("刪除指定位置節點成功:\n");
}
//printf("\n");
printf("鏈表節點的個數爲:%d",length_linklist(head));
printf("鏈表節點的數據排序的結果爲:\n");
sort_node(head);
Display_linklist(head);
}
LinkList*create_linklist()//創建單鏈表
{
LinkList*head;
ElementType data;
LinkList*p;
head=(LinkList*)malloc(sizeof(LinkList));//動態賦儲存空間
LinkList*tail;
//尾插法創建單鏈表
if(head==NULL)
{
printf("鏈表創建失敗!\n");
return NULL;
}
else
{
tail=head;
}
printf("請輸入數據:\n");
data.name=(NameType)malloc(sizeof(char)*20);
while(1)
{
gets(data.name);
p=(LinkList*)malloc(sizeof(LinkList));
p->data.name=(NameType)malloc(sizeof(LinkList));//賦動態存儲空間
if(strcmp(data.name,"^")==0)//strcmp是在字符串之間的比較
{
break;
}
else
{
p->data.id=rand()%50;//隨機時間函數 以時間爲種子 產生隨機數字
strcpy(p->data.name,data.name);
tail->next=p;
tail=p;
p->next=NULL;//使最後一個節點的next指針爲空 等價於tail->next=NULL
}
data.name=(NameType)malloc(sizeof(LinkList));
}
/* //頭插法創建單鏈表
if(head==NULL)
{
printf("創建單鏈表失敗!\n");
return NULL;
}
else{
head->next=NULL;
}
data.name=(NameType)malloc(sizeof(char)*20);//字符串
printf("請輸入數據:\n");
while(1)
{ gets(data.name);
p=(LinkList*)malloc(sizeof(LinkList));
p->data.name=(NameType)malloc(sizeof(char)*20);//動態賦儲存空間
p->data.id=++id;
if(strcmp(data.name,"^")==0)
break;
else
{
strcpy(p->data.name,data.name);
p->next=head->next;
head->next=p;
data.name=(NameType)malloc(sizeof(char)*20);
}
}*/
return head;
}
void Display_linklist(LinkList*head)
{
LinkList*p;
p=head->next;
if(p==NULL)
{
printf("鏈表有誤,遍歷失敗!\n");
return ;
}
else
{
printf("HEAD->");
while(p!=NULL)
{
printf("[%d,%s]->",p->data.id,p->data.name);
p=p->next;
}
printf("END");
}
}
int insert_after_linklist(LinkList*p,LinkList*s)//在p後面插入s節點
{
s->next=p->next;
p->next=s;
return 1;
}
int insert_before_linklist(LinkList*head,LinkList*p,LinkList*s)//在指定節點的前面進行插入
{
if(p==head)//s想插入到head的前面的時候插入失敗
{
return 0;
}
else
{
LinkList*q;
q=head;
while(q->next!=p)
{
q=q->next;
}
insert_after_linklist(q,s);//在q的後面插入s
}
}
void sort_node(LinkList*head)//對鏈表的節點進行排序
{
//對鏈表節點進行遞增排序
LinkList*p,*q;
ElementType *temp;//中間值變量
temp=(ElementType*)malloc(sizeof(ElementType));
for(p=head->next;p->next!=NULL;p=p->next)
for(q=head->next;q->next!=NULL;q=q->next)
{
if(q->data.id>q->next->data.id)
{
*temp=q->data;
q->data=q->next->data;
q->next->data=*temp;//數值進行交換
}
}
}
LinkList*search_data_linklist(LinkList*head,ElementType key)//按值進行查找
{
LinkList*p;
p=head->next;
if(p==NULL)
{
return NULL;
}
else
{
while(p!=NULL)
{
if(strcmp(p->data.name,key.name)==0)
{
break;
}
else
p=p->next;
}
return p;//找到數據對應的節點
}
}
int insert_position(LinkList*head,int i,LinkList*p)//在指定的位置進行插入
{
LinkList*q;
if(i<=0)//在head指針處或者前面進行插入是失敗的
{
return 0;
}
else if(i==1)
{
q=head;//在head指針後面進行插入
}
else
{
q=search_index_linklis(head,i-1);//在i頂點下標前面進行插入 利用search函數進行查找
}
insert_after_linklist(q,p);
return 1;
}
LinkList*search_index_linklis(LinkList*head,int i)//按序號進行查找
{
int j=0;
LinkList*q;
q=head;
//head的位置對應的是0
if(i<0)
{
return NULL;//沒有找到
}
else
{
while(q->next!=NULL&&i>j)
{
j++;
q=q->next;
}
}
if(i==j)
{
return q;
}
else
{
return NULL;
}
}
int dele_node(LinkList*p)//對節點後繼節點進行刪除
{
//對節點的後繼節點進行刪除
LinkList*s;
s=p->next;
p->next=s->next;
free(s);//對刪除節點進行釋放空間
return 1;
}
int delet_node(LinkList*head,LinkList*p)//對指定節點進行刪除
{
LinkList*s;
//假如節點有後繼節點的存在
if(p->next!=NULL)//後繼節點不爲空
{
s=p->next;
p->data=s->data;
p->next=s->next;//將後繼節點的值賦值給其要刪除的節點的數據域
return 1;
}
else
{
//找到節點的前繼接節點
s=head;
while(s->next!=p)
{
s=s->next;
}
dele_node(s);//將s的後繼節點進行刪除(達到刪除指定節點的目的)
return 1;//刪除成功
}
return 0;//刪除失敗
}
int delete_position(LinkList*head,int i )//刪除指定位置的節點
{
//對不可能的情況進行判斷
LinkList*p;
LinkList*s;
p=head;
if(i<0)
{
printf("刪除節點失敗!\n");
return 0;
}
else
{
//對其前繼節點進行查找
s=search_index_linklis(head,i);
if(s==NULL)
return 0;
while(p->next!=s)
{
p=p->next;
}
dele_node(p);//刪除後繼節點即是指定位置的節點
return 1;
}
}
int length_linklist(LinkList*head)//返回鏈表的長度
{
//返回鏈表的長度(鏈表的長度代表鏈表節點的個數)
int count=0;//計算鏈表的長度
LinkList*p;
p=head->next;//指向第一你鏈表數據節點
while(p!=NULL)
{
count++;
p=p->next;
}
return count;//返回鏈表節點的個數
}