单链表带头结点C语⾔实现详细代码
//单链表带头结点
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
//初始化单链表
LinkList initList(LinkList list){
LNode *newNode=(LNode *)malloc(sizeof(LNode));
if(newNode==NULL){
return NULL;
}
(*newNode).next=NULL;
list=newNode;
return list;
}
//指定位置插⼊数据
int insertList(LinkList list,int index,int data){
LNode *tmp=list;
int j=0;
if(index<1){
return 0;
}
while(tmp!=NULL&&j<index-1){
tmp=(*tmp).next;
j++;
}
if(tmp==NULL){
return 0;
}
LNode *newNode=(LNode *)malloc(sizeof(LNode));
if(newNode==NULL){
return 0;
}
(*newNode).data=data;
(*newNode).next=(*tmp).next;
(*tmp).next=newNode;
return 1;
}
//指定结点后插⼊数据
int insertNextNode(LNode *p,int data){
LNode *newNode = (LNode *)malloc(sizeof(LNode));
if(newNode == NULL){
return 0;
}
(*newNode).data = data;
(*newNode).data = data;
(*newNode).next = (*p).next;
(*p).next = newNode;
return 1;
}
//指定结点前插⼊数据:移动
int insertPriorNodeOne(LNode *p, int data){
if(p==NULL){
return 0;
}
LNode *newNode = (LNode *)malloc(sizeof(LNode)); if(newNode == NULL){
return 0;
}
(*newNode).next=(*p).next;
(*p).next = newNode;
(*newNode).data = (*p).data;
(*p).data = data;
}
/
/指定结点前插⼊数据:循环
int insertPriorNodeTwo(LinkList list,LNode *p, int data){ LNode *tmp=list;
if(p==NULL){
return 0;
}
while(tmp!=NULL&&(*tmp).next!=p){
tmp = (*tmp).next;
}
if(tmp==NULL){
return 0;
}
LNode *newNode = (LNode *)malloc(sizeof(LNode)); if(newNode==NULL){
return 0;
}
(*newNode).next = p;
(*tmp).next = newNode;
(*newNode).data = data;
return 1;
}
//删除指定位置的数据
int deleteList(LinkList list,int index,int *data){
LNode* tmp = list;
int j = 0;
if(index<1){
return 0;
}
while(tmp!=NULL&&j<index-1){
tmp = (*tmp).next;
j++;
}
if(tmp==NULL||(*tmp).next==NULL){
return 0;
}
LNode *p=(*tmp).next;
*data = (*p).data;
(*tmp).next=(*p).next;
free(p);
return 1;
}
//删除指定结点p:移动数据
//删除指定结点p:移动数据
int deleteNodeOne(LNode *p){
if(p==NULL){
return 0;
}
LNode *q = (*p).next;
(*p).next = (*q).next;
(*p).data = (*q).data;
free(q);
return 1;
}
//删除指定结点p : 循环
int deleteNodeTwo(LinkList list,LNode *p){ LNode *tmp = list;
while(tmp!=NULL&&(*tmp).next!=p){
tmp = (*tmp).next;
}
if(tmp==NULL){
return 0;
}
(*tmp).next = (*p).next;
free(p);
return 1;
}
//按位查;返回指定位置的结点
LNode*  getElementByIndex(LinkList list,int index){ LNode *tmp = list;
int j = 0;
if(index < 0){
return NULL;
}
while(tmp!=NULL&&j<index){
tmp = (*tmp).next;
j++;
printf("tmp=%d",(*tmp).next->data);
}
printf("\n最后tmp=%d",(*tmp).next->data);
return tmp;
}
/
/按值查:返回指定值的结点
LNode* getElementByData(LinkList list,int data){ LNode *tmp = list;
while(tmp!=NULL&&(*tmp).data!=data){
tmp = (*tmp).next;
printf("tmp=%d",(*tmp).next->data);
}
printf("\n最后tmp=%d",(*tmp).next->data);
return tmp;
}
//表长
int getLength(LinkList list){
int length = 0;
LNode *tmp = list;
while((*tmp).next!=NULL){
tmp = (*tmp).next;
length++;
}
return length;
}
//头插法,建链表
void constructLinkListOne(LinkList list){
void constructLinkListOne(LinkList list){
c语言listinsert函数int i = 0;
for(;i<5;i++){
insertList(list,1,i+1);
printf("%d,",(*list).next->data);
}
}
//清空链表
void clearList(LinkList list) {
LinkList p;
while ((*list).next) {
p = (*list).next;
(*list).next =(*p).next;
free(p);
}
}
//尾插法,建链表
void constructLinkListTwo(LinkList list){
int i = 0,j = 0;
for(;i<5;i++){
insertList(list,j+1,i+1);
j++;
}
LNode *tmp = list;
for(i=0;i<5;i++){
// while(tmp!=NULL){
tmp = (*tmp).next;
printf("%d,",(*tmp).data);
}
}
void bianli(LinkList list){
LNode *tmp = list;
while(tmp!=NULL&&(*tmp).next!=NULL){
tmp = (*tmp).next;
printf("%d,",(*tmp).data);
}
printf("\n");
}
int main(){
int length = 0;
int i = 0;
LinkList list;
list = initList(list);
printf("初始化:\n%d",(*list).next);
printf("\n新建⼀个链表(头插):\n");
constructLinkListOne(list);
printf("\n");
clearList(list);
printf("\n新建⼀个链表(尾插):\n");
constructLinkListTwo(list);
printf("\n");
printf("\n求表长:\n");
length = getLength(list);
printf("%d\n",length);
printf("\n插⼊⼀个数据后的链表:\n");
insertList(list,3,999);
bianli(list);
printf("\n指定结点后⾯插⼊数据(指定结点的位置):\n"); LNode *tmp = list;
while(i<3){
list = (*list).next;
i++;
}
insertNextNode( (*list).next,333);
bianli(list);
printf("\n指定结点后⾯插⼊数据(指定结点的值):\n"); while((*tmp).data!=3){
tmp = (*tmp).next;
}
insertNextNode( (*tmp).next,444);
bianli(list);
printf("\n按位查:返回指定位置的结点(2):\n");
getElementByIndex(list,2);
printf("\n\n按值查:返回指定值的结点(5):\n");
getElementByData(list,5);
return 0;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。