链表的操作
2006-06-07 11:28
330 查看
链表是数据结构中的一个重要组成部分,对链表操作的熟练度怎么要求都不过分。
(只有部分核心代码)
主要内容:
1) 链表的建立
2) 链表的释放
3) 链表的查找
4) 链表中节点的插入
5) 链表中节点的删除
6) 链表的反转
7) 两个链表的连接
#define MAX 15
/* 节点声明 */
struct list
{
int number;
int name[MAX];
struct list *next;
};
typedef struct list Node;
typedef Node *Link;
/* 建立链表,返回指向头节点的指针 */
Link Creat_List(Link head)
{
int dataNum; /* 数据编号 */
char dataName[MAX]; /* 数据名字 */
Link newNode;
Link pointer;
int i;
/* 创建头节点 */
head = (Link) malloc(sizeof(Node)); /* 分配内存 */
if( NULL == head )
printf(" Allocation Failure/n"); /* 分配内存失败 */
else
{
dataNum = 1;
printf("Enter the data name:/n");
scanf("%s",dataNum);
head->number = dataNum;
for( i=0; i<MAX; ++i)
head->name[ i] = dataNum[ i];
head->next = NULL;
pointer = head;
/* 创建链表 */
while(1)
{
dataNum++;
newNode = (Link)malloc(sizeof(Node));
printf("Enter the data name:/n");
sacnf("%s",dataName);
if(dataName[0] == '0') /* 输入0,结束 */
break;
newNode->number = dataNum;
for( i=0; i<MAX; ++i)
newNode->name[ i] = dataName[ i];
newNode->next = NULL;
pointer->next = newNode; /* 连接新节点 */
pointer = newNode;
}
}
return head;
}
/* 释放链表 */
void free_list(Link head)
{
Link pointer;
while( head != NULL )
{
pointer = head;
head = head->next;
free(pointer);
}
}
/* 链表的查找 */
int Search_list(int key, Link head) /* key 为要查找的数据 */
{
Link pointer;
pointer = head;
while( pointer != NULL )
{
if( pointer->number == key )
{
printf("found it!/n");
return 1;
}
}
return 0;
}
/* 节点的插入 */
Link Insert_list(Link head, Link newNode, int key)
{
Link pointer;
pointer = head;
while(1)
{
/* 在链表头之前插入 */
if( NULL == pointer )
{
newNode->next = head;
head = newNode;
break;
}
/* 在链表其他地方插入 */
if( pointer->number == key )
{
newNode->next = pointer->next;
pointer->next = newNode;
break;
}
pointer = pointer->next ;
return head;
}
}
/* 链表里节点的删除 */
Link Delete_list(Link head, int key)
{
Link pointer;
Link back;
pointer = head;
while(1)
{
if( pointer->next == NULL )
{
printf("not found./n");
break;
}
/* 删除的节点是头节点 */
if( head->number == key)
{
head = pointer->next ;
free(pointer);
break;
}
/* 删除链表中其他节点 */
back = pointer;
pointer = pointer->next ;
if( pointer->next == key )
{
back->next = pointer->next ;
free(pointer);
break;
}
}
return head;
}
/* 链表的反转 */
Link Reverse_list(Link head)
{
Link pointer;
Link back;
Link nextNode;
back = head; /* back 指针设为首节点 */
pointer = back->next;
back->next = NULL;
nextNode = pointer->next;
pointer->next = back;
back = pointer;
pointer = nextNode;
while( pointer->next != NULL )
{
nextNode = pointer->next;
pointer->next = back;
back = pointer;
pointer = nextNode;
}
/* 达到链表尾 */
pointer->next = back;
head = pointer;
return head;
}
/* 两个链表的连接 */
Link Connect_list( Link head1, Link head2)
{
Link pointer;
Link back;
Link nextNode;
pointer = head1;
while( pointer->next != NULL )
pointer = pointer->next;
pointer->next = head2;
return head1;
}
(只有部分核心代码)
主要内容:
1) 链表的建立
2) 链表的释放
3) 链表的查找
4) 链表中节点的插入
5) 链表中节点的删除
6) 链表的反转
7) 两个链表的连接
#define MAX 15
/* 节点声明 */
struct list
{
int number;
int name[MAX];
struct list *next;
};
typedef struct list Node;
typedef Node *Link;
/* 建立链表,返回指向头节点的指针 */
Link Creat_List(Link head)
{
int dataNum; /* 数据编号 */
char dataName[MAX]; /* 数据名字 */
Link newNode;
Link pointer;
int i;
/* 创建头节点 */
head = (Link) malloc(sizeof(Node)); /* 分配内存 */
if( NULL == head )
printf(" Allocation Failure/n"); /* 分配内存失败 */
else
{
dataNum = 1;
printf("Enter the data name:/n");
scanf("%s",dataNum);
head->number = dataNum;
for( i=0; i<MAX; ++i)
head->name[ i] = dataNum[ i];
head->next = NULL;
pointer = head;
/* 创建链表 */
while(1)
{
dataNum++;
newNode = (Link)malloc(sizeof(Node));
printf("Enter the data name:/n");
sacnf("%s",dataName);
if(dataName[0] == '0') /* 输入0,结束 */
break;
newNode->number = dataNum;
for( i=0; i<MAX; ++i)
newNode->name[ i] = dataName[ i];
newNode->next = NULL;
pointer->next = newNode; /* 连接新节点 */
pointer = newNode;
}
}
return head;
}
/* 释放链表 */
void free_list(Link head)
{
Link pointer;
while( head != NULL )
{
pointer = head;
head = head->next;
free(pointer);
}
}
/* 链表的查找 */
int Search_list(int key, Link head) /* key 为要查找的数据 */
{
Link pointer;
pointer = head;
while( pointer != NULL )
{
if( pointer->number == key )
{
printf("found it!/n");
return 1;
}
}
return 0;
}
/* 节点的插入 */
Link Insert_list(Link head, Link newNode, int key)
{
Link pointer;
pointer = head;
while(1)
{
/* 在链表头之前插入 */
if( NULL == pointer )
{
newNode->next = head;
head = newNode;
break;
}
/* 在链表其他地方插入 */
if( pointer->number == key )
{
newNode->next = pointer->next;
pointer->next = newNode;
break;
}
pointer = pointer->next ;
return head;
}
}
/* 链表里节点的删除 */
Link Delete_list(Link head, int key)
{
Link pointer;
Link back;
pointer = head;
while(1)
{
if( pointer->next == NULL )
{
printf("not found./n");
break;
}
/* 删除的节点是头节点 */
if( head->number == key)
{
head = pointer->next ;
free(pointer);
break;
}
/* 删除链表中其他节点 */
back = pointer;
pointer = pointer->next ;
if( pointer->next == key )
{
back->next = pointer->next ;
free(pointer);
break;
}
}
return head;
}
/* 链表的反转 */
Link Reverse_list(Link head)
{
Link pointer;
Link back;
Link nextNode;
back = head; /* back 指针设为首节点 */
pointer = back->next;
back->next = NULL;
nextNode = pointer->next;
pointer->next = back;
back = pointer;
pointer = nextNode;
while( pointer->next != NULL )
{
nextNode = pointer->next;
pointer->next = back;
back = pointer;
pointer = nextNode;
}
/* 达到链表尾 */
pointer->next = back;
head = pointer;
return head;
}
/* 两个链表的连接 */
Link Connect_list( Link head1, Link head2)
{
Link pointer;
Link back;
Link nextNode;
pointer = head1;
while( pointer->next != NULL )
pointer = pointer->next;
pointer->next = head2;
return head1;
}
相关文章推荐