//(C語(yǔ)言)鏈表創(chuàng)建,輸出嚷堡,結(jié)點(diǎn)地址取值,值取結(jié)點(diǎn)地址艇棕,插入新值蝌戒,刪除值
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define error 0
typedef struct Node
{
? ? int data;
? ? struct Node *next;
} LNode, *LinkList;
LinkList CreateList_R(LNode *L, int n)
{
? ? int i;
? ? LNode *p, *r;
? ? L->next = NULL; //建立一個(gè)帶頭結(jié)點(diǎn)的空鏈表
? ? r = L;? ? ? ? ? //尾指針r指向頭結(jié)點(diǎn)
? ? for (i = 0; i < n; i++)
? ? {
? ? ? ? p = (LNode *)malloc(sizeof(LNode));
? ? ? ? printf("請(qǐng)輸入第%d個(gè)數(shù)", i + 1);
? ? ? ? scanf("%d", &p->data);
? ? ? ? p->next = NULL; //建立一個(gè)帶頭結(jié)點(diǎn)的空鏈表
? ? ? ? r->next = p;
? ? ? ? r = p;
? ? }
? ? r->next = L;
? ? return L;
}
void print(LNode *L)
{
? ? LNode *r;
? ? r = L;
? ? while (r->next != L) //r所指節(jié)點(diǎn)不能為空
? ? {
? ? ? ? r = r->next;? ? ? ? ? ? //r后移指向下一個(gè)節(jié)點(diǎn)
? ? ? ? printf("%d ", r->data); //輸出r所指的節(jié)點(diǎn)的值
? ? }
? ? printf("\n");
}
LinkList GetElem(LNode *L, int i, int e)
{
? ? int j = 1;
? ? LNode *p;
? ? p = L->next;
? ? while (p->next != L && j < i)
? ? {
? ? ? ? p = p->next;
? ? ? ? j++;
? ? }
? ? if (!p || j > i)
? ? {
? ? ? ? printf("error");
? ? ? ? return error;
? ? }
? ? e = p->data;
? ? printf("輸出要找的數(shù)第%d個(gè)數(shù):%d\n", i, e);
? ? return 0;
}
LinkList LocateElem(LNode *L, int e)
{
? ? LNode *p;
? ? int i = 1;
? ? p = L->next;
? ? while (p && p->data != e)
? ? {
? ? ? ? p = p->next;
? ? ? ? i++;
? ? }
? ? printf("要查找的數(shù)據(jù)的結(jié)點(diǎn)地址為:%d\n", i);
? ? return p;
}
LinkList ListInsert(LNode *L, int i, int e)
{
? ? LNode *p;
? ? int j = 0;
? ? p = L;
? ? while (p && (j < i - 1))
? ? {
? ? ? ? p = p->next;
? ? ? ? j++;
? ? }
? ? if (!p || j > i - 1)
? ? {
? ? ? ? return error;
? ? }
? ? LNode *s;
? ? s = (LNode *)malloc(sizeof(LNode));
? ? s->data = e;
? ? s->next = p->next;
? ? p->next = s;
? ? printf("輸出插入數(shù)后的新鏈表:");
? ? LNode *r;
? ? r = L;
? ? while (r->next != L) //r所指節(jié)點(diǎn)不能為空
? ? {
? ? ? ? r = r->next;? ? ? ? ? ? //r后移指向下一個(gè)節(jié)點(diǎn)
? ? ? ? printf("%d ", r->data); //輸出r所指的節(jié)點(diǎn)的值
? ? }
? ? printf("\n");
? ? return 0;
}
LinkList ListDelete(LNode *L, int i)
{
? ? LNode *p, *q;
? ? p = L;
? ? int j = 0;
? ? while ((p->next) && (j < i - 1))
? ? {
? ? ? ? p = p->next;
? ? ? ? j++;
? ? }
? ? q = p->next;
? ? p->next = q->next;
? ? free(q);
? ? printf("輸出刪除數(shù)后的新鏈表:");
? ? LNode *r;
? ? r = L;
? ? while (r->next != L) //r所指節(jié)點(diǎn)不能為空
? ? {
? ? ? ? r = r->next;? ? ? ? ? ? //r后移指向下一個(gè)節(jié)點(diǎn)
? ? ? ? printf("%d ", r->data); //輸出r所指的節(jié)點(diǎn)的值
? ? }
? ? printf("\n");
? ? return 0;
}
int main()
{
? ? LNode *A;
? ? int length_A, i, e;
? ? A = (LNode *)malloc(sizeof(LNode));
? ? printf("請(qǐng)輸入需要輸入的數(shù)據(jù)個(gè)數(shù):");
? ? scanf("%d", &length_A);
? ? CreateList_R(A, length_A);
? ? printf("輸出剛才輸入的數(shù)據(jù):");
? ? print(A);
? ? printf("請(qǐng)輸入需要取的數(shù)據(jù)序號(hào):");
? ? scanf("%d", &i);
? ? GetElem(A, i, e);
? ? printf("請(qǐng)輸入需要取的數(shù)據(jù)值:");
? ? scanf("%d", &e);
? ? LocateElem(A, e);
? ? printf("輸入需要插入的數(shù)據(jù)的位置和值(空格隔開(kāi)):");
? ? scanf("%d %d", &i, &e);
? ? ListInsert(A, i, e);
? ? printf("輸入需要?jiǎng)h除的數(shù)據(jù)的位置:");
? ? scanf("%d", &i);
? ? ListDelete(A, i);
? ? return 0;
}